hdu 2045 DP

来源:互联网 发布:知乎精华 mobi 编辑:程序博客网 时间:2024/06/04 08:05

初级DP。

网上还有更精简的代码,只用一维数组。 参考:http://hi.baidu.com/zihuacs/item/cd160b84ef1c782d100ef3ad


#include "stdio.h"#include "string.h"void main(){int n, i;__int64 dp[51][3][3];  //分别表示:第i个方块 3种颜色 序列的第一个方块的颜色freopen("in.txt", "r", stdin);while(scanf("%d", &n)!=EOF){memset(dp, 0, sizeof(dp));dp[1][0][0] = 1;dp[1][1][1] = 1;dp[1][2][2] = 1;for(i=2; i<=n; i++){dp[i][0][0] = dp[i-1][1][0] + dp[i-1][2][0];  //第i个方块的第0种颜色且起始方块颜色为0的个数,等于第i-1个方块的第1种……dp[i][0][1] = dp[i-1][1][1] + dp[i-1][2][1];dp[i][0][2] = dp[i-1][1][2] + dp[i-1][2][2];dp[i][1][0] = dp[i-1][0][0] + dp[i-1][2][0];dp[i][1][1] = dp[i-1][0][1] + dp[i-1][2][1];dp[i][1][2] = dp[i-1][0][2] + dp[i-1][2][2];dp[i][2][0] = dp[i-1][0][0] + dp[i-1][1][0];dp[i][2][1] = dp[i-1][0][1] + dp[i-1][1][1];dp[i][2][2] = dp[i-1][0][2] + dp[i-1][1][2];}if(n==1)printf("3\n");elseprintf("%I64d\n", dp[n][0][1]+dp[n][0][2] + dp[n][1][0]+dp[n][1][2] + dp[n][2][0]+dp[n][2][1]);}}