Vijos 1193 扫雷(状态压缩DP)
2013-03-12 22:01
302 查看
题目链接
思路很简单。。。但是细节啊。。。。WA了好多次。。。
思路很简单。。。但是细节啊。。。。WA了好多次。。。
#include <cstdio> #include <cstring> #include <cmath> #include <string> #include <ctime> #include <cstdlib> using namespace std; int p[10001]; int dp1[10],dp2[10],o[3]; int main() { int i,j,n,k; scanf("%d",&n); for(i = 1;i <= n;i ++) { scanf("%d",&p[i]); } if(p[1] == 1) { dp1[1] = 1; dp1[2] = 1; } else if(p[1] == 0) dp1[0] = 1; else if(p[1] == 2) { dp1[3] = 1; } if(n == 1) { if(p[1] == 1||p[1] == 0) printf("%d\n",1); else printf("0\n"); return 0; } else if(n == 2) { if(p[1] == 0&&p[2] == 0) printf("1\n"); else if(p[1] == 1&&p[2] == 1) printf("2\n"); else if(p[1] == 2&&p[2] == 2) printf("1\n"); else printf("0\n"); return 0; } for(i = 3;i <= n;i ++) { for(j = 0;j < 4;j ++) { o[0] = o[1] = 0; for(k = 0;k <= 1;k ++) { if(j&(1<<k)) o[k] ++; } if(o[0]+o[1] == p[i-1]) { dp2[o[1]] += dp1[j]; } else if(o[0]+o[1]+1 == p[i-1]) { dp2[o[1]+2] += dp1[j]; } } for(j = 0;j < 4;j ++) { dp1[j] = dp2[j]; dp2[j] = 0; } } if(p == 2) printf("%d\n",dp1[3]); else if(p == 0) printf("%d\n",dp1[0]); else if(p == 1) printf("%d\n",dp1[1]+dp1[2]); else printf("0\n"); return 0; }
相关文章推荐
- Vijos 1456 最小总代价(状态压缩DP)
- vijos1426(状态压缩背包dp)
- 哈希算法状态压缩dp vijos 1426
- vijos - P1286座位安排 (DP状态压缩 + 组合数 + python)
- Vijos 1286 座位安排(状态压缩DP)
- HDU 5965 扫雷(dp/状态压缩dp)
- HDU1565 方格取数(1) (状态压缩DP)
- uva_10651_Pebble Solitaire(状态压缩DP)
- poj 2288 状态压缩dp Islands and Bridges
- POJ 3254 状态压缩DP
- dp专辑 H - 炮兵阵地 [ 状态压缩]
- PKU 3254 状态压缩DP
- ZOJ 3471 Most Powerful(状态压缩DP)
- hdu1074 状态压缩dp 记录路径
- 状态压缩动态规划(压缩状态DP)学习笔记
- HDU 3341 Lost's revenge(AC自动机+状态压缩DP)
- (状态压缩DP) poj 2978
- POJ 2411 状态压缩DP
- Poj 1185 炮兵阵地 【状态压缩dp】
- poj3254 状态压缩dp