您的位置:首页 > 其它

Vijos 1193 扫雷(状态压缩DP)

2013-03-12 22:01 302 查看
题目链接

思路很简单。。。但是细节啊。。。。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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: