HDU 1992

来源:互联网 发布:怎么登陆淘宝卖家中心 编辑:程序博客网 时间:2024/05/01 22:59

 思路:灵感来自于数字逻辑时序电路的状态转移法,具体如下:

1. 状态编码:设待补充部分为:col列加上余列X,其中X有0000、1100、0011、0110、1001五种状态(1表示有,0表示无),进一步状态压缩为0-4五个数;
2. 状态转移:通过递归
3. 注意:为保证效率,使用动态规划
#include<iostream> #include<algorithm>#include<cstring>#include<cstdio> using namespace std;const int M[5][5] = {{3, 1, 1, 1, 0},{1, 0, 1, 0, 0},{1, 1, 0, 0, 0},{1, 0, 0, 0, 1},{0, 0, 0, 1, 0}};int DP[1000][5];// DP[i][j]表示拼成【i列加上j对应的余列】的情况数int W;int DFS(int col, int state){if(col == 0 && state == 0)return 1;if(col <= 0)return 0;int& ans = DP[col][state];if(ans > 0)return ans;for(int i = 0; i < 5; i++){if(M[state][i]){ans += DFS(col-1, i); if(M[state][i] == 3)ans += DFS(col-2, i);}}return ans;}int main(){memset(DP, 0, sizeof(DP));DFS(1000, 0);int T;scanf("%d", &T);for(int kase = 1; kase <= T; kase++){printf("%d ", kase);scanf("%d", &W);printf("%d\n", DFS(W, 0));}}

1 0
原创粉丝点击