51node1371 填数字(dp)
2016-10-08 16:06
120 查看
51node1371
题目
中文题目思路
dp[i][j][k]表示第i行填完之后有j列的和是1,k列的和是2,我们枚举每行的最后一个为0,1,2时的情况分类讨论。具体看代码,注意注释是有层次的。(感觉状态设计得很好,学到了)
代码
#include <iostream> #include <algorithm> #include <cmath> #include <vector> #include <string> #include <cstring> #include <cstdio> using namespace std; typedef long long ll; const int mod=1e8+7; ll dp[205][205][205]; int n; int main() { scanf("%d",&n); dp[1][0][0]=dp[1][0][1]=dp[1][1][0]=1; for(int i=2; i<=n; i++) { for(int j=0; j<=i; j++) for(int k=0; j+k<=i; k++) { //末0 //加2 if(i-j-k-1>=1) dp[i][j][k+1]=(dp[i][j][k+1]+dp[i-1][j][k]*(i-j-k-1))%mod; //加两个1 //加到00 if(i-k-j-1>=2) dp[i][j+2][k]=(dp[i][j+2][k]+dp[i-1][j][k]*((i-j-k-1)*(i-j-k-2)/2))%mod; //加到01 if(j>=1&&i-j-k-1>=1) dp[i][j][k+1]=(dp[i][j][k+1]+dp[i-1][j][k]*j*(i-j-k-1))%mod; //加到11 if(j>=2) dp[i][j-2][k+2]=(dp[i][j-2][k+2]+dp[i-1][j][k]*(j*(j-1)/2))%mod; //加一个1 //加到1 if(j>=1) dp[i][j-1][k+1]=(dp[i][j-1][k+1]+dp[i-1][j][k]*j)%mod; //加到0 if(i-j-k-1>=1) dp[i][j+1][k]=(dp[i][j+1][k]+dp[i-1][j][k]*(i-j-1-k))%mod; //什么都不加 dp[i][j][k]=(dp[i][j][k]+dp[i-1][j][k])%mod; //最后1 //1加0上 if(i-j-k-1>=1) dp[i][j+2][k]=(dp[i][j+2][k]+dp[i-1][j][k]*(i-j-k-1))%mod; //1加1上 if(j>=1) dp[i][j][k+1]=(dp[i][j][k+1]+dp[i-1][j][k]*j)%mod; //都不加 dp[i][j+1][k]=(dp[i][j+1][k]+dp[i-1][j][k])%mod; //最后为2 dp[i][j][k+1]=(dp[i][j][k+1]+dp[i-1][j][k])%mod; } } ll sum = 0; for (int j = 0; j <= n; j++) for (int k = 0; k <= n - j; k++) sum = (sum + dp [j][k]) % mod; printf("%I64d\n", sum); return 0; }
相关文章推荐
- 【洛谷】2034 选择数字 DP+单调队列
- BZOJ 1833: [ZJOI2010]count 数字计数 【数位DP】
- BZOJ 1833: [ZJOI2010]count 数字计数 数位DP,处理前导0
- BZOJ 3679 数字之积 (数位DP)
- bzoj1833: [ZJOI2010]count 数字计数 数位dp
- luogu1043【2003普及】数字游戏(区间dp)
- bzoj 1833: [ZJOI2010]count 数字计数【数位dp】
- SPOJ GNYR09F 数字上的找规律DP
- 简单dp-数字三角问题
- 【BZOJ1833】【ZJOI2010】数字计数 数位DP
- 【划分型DP】数字游戏
- POJ 3252 Round Numbers(数位dp,区间中二进制表示时0的个数大于等于1的个数的数字的个数)
- dp:数字三角形问题
- [BZOJ]3679: 数字之积 数位DP
- [DP 状态稀疏性优化] BZOJ 2925 [Poi1999]单一阿拉伯数字表示法 Monodigital Representations
- 【DP】组合数字
- BZOJ 3679 数字之积 - 数位dp
- soj 2113 数字游戏(环形DP)
- 51 nod 1354 选数字(stl+dp)
- 关于要求一串数字不超过某个数字可以达到的最大和(DP背包问题)