hdu_5965_扫雷(递推)

题目链接:hdu_5965_扫雷

题意:

中文,还是自己看吧。

题解:

现场赛这题用的状压DP过的,不过现在想想当时还确实想复杂了,冷静下来仔细思靠一下,其实第i-1个确定了,那么第i个也是确定的,可以递推出来。

设dp[i]表示第i列的雷数,然后枚举一下第一列的雷数,就可以推出所有的雷,然后算一下贡献

 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=a;i<=b;i++)
 3 using namespace std;
 4 
 5 const int N=1e4+7,P=1e8+7;
 6 
 7 char s[N];
 8 int num[N],dp[N],t,ans,n;
 9 
10 int main()
11 {
12     scanf("%d",&t);
13     while(t--)
14     {
15         scanf("%s",s+1),ans=0;
16         n=strlen(s+1);
17         for(int i=1;i<=n;i++)num[i]=s[i]-'0';
18         F(i,0,num[1])
19         {
20             dp[1]=i;
21             if(i>2)break;
22             int j;
23             for(j=2;j<=n;j++)
24             {
25                 int now=num[j-1]-dp[j-1]-dp[j-2];
26                 if(now>2||now<0)break;
27                 dp[j]=now;
28             }
29             if(j<=n||dp[n-1]+dp[n]!=num[n])continue;
30             int an=1;
31             F(j,1,n)if(dp[j]==1)an*=2,an%=P;
32             ans+=an,ans%=P;
33         }
34         printf("%d
",ans);
35     }
36     return 0;
37 }
View Code
原文地址:https://www.cnblogs.com/bin-gege/p/6033731.html