首页 > 代码库 > hdu_5965_扫雷(递推)
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\n",ans); 35 } 36 return 0; 37 }
hdu_5965_扫雷(递推)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。