CodeForces 44H - Phone Number-dp
2015-11-15 15:42
337 查看
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20079
题意:
给你一个电话号码,根据这个号码生成一个新的号码。生成的规则就是 新号码的第一个数任意选(0-9), 然后之后的每一个新号码都按照以下规则生成:
第i个新号码 = (第 i-1个新号码 +第i个老号码 的和)/2 , 这里如果乘除,则新号码i唯一,否则新号码i可以向上或向下取整;
求总共能生成多少种号码
如果发现老号码本身能得到 自己,那么种类数要减一 (求得是 生成的 新的号码数)
题意:
给你一个电话号码,根据这个号码生成一个新的号码。生成的规则就是 新号码的第一个数任意选(0-9), 然后之后的每一个新号码都按照以下规则生成:
第i个新号码 = (第 i-1个新号码 +第i个老号码 的和)/2 , 这里如果乘除,则新号码i唯一,否则新号码i可以向上或向下取整;
求总共能生成多少种号码
q=第i+1位的老号码; j为第i位上的新号码
<span style="white-space:pre"> </span>if ((q+j)%2==0) dp[i][j]=dp[i+1][(q+j)/2]; else dp[i][j]=dp[i+1][(q+j)/2]+dp[i+1][(q+j+1)/2];
如果发现老号码本身能得到 自己,那么种类数要减一 (求得是 生成的 新的号码数)
#include <cstdio> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <iostream> #include <queue> #include <map> #include <set> #include <vector> using namespace std; __int64 tm[55]; __int64 dp[55][15]; char s[105]; __int64 test[55]; int main() { __int64 i,j; scanf("%s",s); __int64 n=strlen(s); for (i=0;i<n;i++) tm[i+1]=s[i]-'0'; for (j=0;j<=9;j++) dp [j]=1; for (i=n-1;i>=1;i--) { for (j=0;j<=9;j++) { __int64 q=tm[i+1]; if ((q+j)%2==0) dp[i][j]=dp[i+1][(q+j)/2]; else dp[i][j]=dp[i+1][(q+j)/2]+dp[i+1][(q+j+1)/2]; } } __int64 flag=1; for (i=1;i<=n;i++) test[i]=tm[i]; for (i=2;i<=n;i++) { if ((test[i]==(tm[i]+test[i-1])/2) ||(test[i]==(tm[i]+test[i-1]+1)/2) ) continue; else { flag=0; //自己不在里面 break; } } __int64 ans=0; for (i=0;i<=9;i++) { ans+=dp[1][i]; } printf("%I64d\n",ans-flag); return 0; }
相关文章推荐
- 文件下载注意的地方
- 安装sql server2000时提示被挂起
- fedora22下配置hadoop
- [C++] Virtual Destructor(虚析构函数)
- UIView
- Xcode因为证书问题经常报的那些错
- JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
- hdu 2841
- UI框架
- IOS面试题<转>
- 第一个java项目,完!
- CF 543A 【dp】
- linux命令学习
- Java中AWT,Swing与SWT三大GUI技术的原理与效率区别
- Keras 深度学习框架Python Example:CNN/mnist
- linux运维
- Fruit Ninja(树状数组+思维)
- 编程艺术 二进制中1的个数
- 自定义控件(16)---代码方式组合系统控件,并封装自定义控件思想
- Android开发 设计模式(二、 Factory Method(工厂方法模式))