hdu5456(记忆化搜索)
来源:互联网 发布:ise12.3软件下载 编辑:程序博客网 时间:2024/06/05 02:52
题目链接:hdu5456
题目大意:用n根火柴正好摆出A-B=C,求一共有多少种方法。(n根火柴包括‘-’,‘=’,且A,B,C不能有前导0)
题目分析:具体见代码。参考资料:大神博客
代码:
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;typedef long long LL;const int maxn=1000;int n,T,mod,Case=1;int stick[10]={6, 2, 5, 5, 4, 5, 6, 3, 7, 6};/* 式子可以变换成A=B+C,从低位处理到高位, dp[i][j][b][c]表示到第i位,j有没进位, b为数字B是否已经到达最高位,c为数字C是否已经到达最高位。 ps:如果b为1,代表B的值已经确定*/LL dp[maxn][2][2][2];//rest:还剩下多少火柴棍 carry:B和C的对应位相加是否产生了进位//b:B是否确定 c:C是否确定LL dfs(int rest,int carry,int b,int c){ if(rest<0) return 0; LL& ans=dp[rest][carry][b][c]; if(ans!=-1) return ans; //记忆化 /* B和C的值已经确定:1.火柴棒已经用完(且B和C的最高位相加未产生进位) 2.火柴棒还剩下2根,这时可以在A的前面加一个1使式子成立(B和C的最高位相加产生进位) 这两种情况都是符合题意的情况 */ if(((rest==stick[1]&&carry==1)||(rest==0&&carry==0))&&b&&c) return ans=1; ans=0; if(b==0&&c==0){ //B和C都未确定 for(int i=0;i<10;i++){ for(int j=0;j<10;j++){ int high=(i+j+carry)/10,low=(i+j+carry)%10; //B和C都没有确定 ans+=dfs(rest-stick[i]-stick[j]-stick[low],high,0,0); //B确定 if(i) ans+=dfs(rest-stick[i]-stick[j]-stick[low],high,1,0); //C确定 if(j) ans+=dfs(rest-stick[i]-stick[j]-stick[low],high,0,1); //B和C确定 if(i&&j) ans+=dfs(rest-stick[i]-stick[j]-stick[low],high,1,1); ans=ans%mod; } } } else if(b==0){ //B已经确定 for(int i=0;i<10;i++){ int high=(i+carry)/10,low=(i+carry)%10; ans+=dfs(rest-stick[i]-stick[low],high,0,1); if(i) ans+=dfs(rest-stick[i]-stick[low],high,1,1); ans=ans%mod; } } else if(c==0){ //C已经确定 for(int i=0;i<10;i++){ int high=(i+carry)/10,low=(i+carry)%10; ans+=dfs(rest-stick[i]-stick[low],high,1,0); if(i) ans+=dfs(rest-stick[i]-stick[low],high,1,1); ans=ans%mod; } } return ans%mod;}int main(){// freopen("in.txt","r",stdin); for(scanf("%d",&T);T--;){ scanf("%d%d",&n,&mod); memset(dp,-1,sizeof(dp)); printf("Case #%d: %lld\n",Case++,dfs(n-3,0,0,0)); } return 0;}
阅读全文
0 0
- hdu5456(记忆化搜索)
- HDU5456 Matches Puzzle Game (记忆化搜索)
- hdu5456 Matches Puzzle Game(记忆化dfs+dp)
- hdu_p1078(记忆化搜索)
- WOJ(记忆化搜索)
- 滑雪 (记忆化搜索)
- hihocoder1037(记忆化搜索)
- hdu1078 (记忆化搜索)
- HDU3555Bomb(记忆化搜索)
- uva10626(记忆化搜索)
- *hdu1078(记忆化搜索)
- 滑雪(记忆化搜索)
- poj1088(记忆化搜索)
- hdu1069(*记忆化搜索)
- poj3186(记忆化搜索)
- uva1637(记忆化搜索)
- 记忆化搜索(搜索+dp思想)
- (sgu)Balloons(记忆化搜索)
- 欢迎使用CSDN-markdown编辑器
- 用递归输出n的阶乘
- 实训第四天
- 机器学习与scikit-learn(一)——回归模型
- 邻接矩阵,邻接表表示图,深度优先遍历
- hdu5456(记忆化搜索)
- AES工具类
- python笔记--*args 和 **kwargs
- 构造包含一个元素的元组规则解析
- macOS装回java8
- js常用方法总结
- dubbo实战---No provider available for the service
- CXF实现wsdl文件转换为javaBean
- CSDN中搜索用户