#include <stdio.h> #include <iostream> #include <string.h> #include <algorithm> #define MAX 1000005 using namespace std; int max(int a,int b) { if(a>b) return a; else return b; } int main() { int n,m; long long dp[20][3]; memset(dp,0,sizeof(dp)); dp[0][0]=1; for(int i=1;i<=20;i++) { dp[i][0]=dp[i-1][0]*10-dp[i-1][1];// xxxx - 49xx dp[i][1]=dp[i-1][0];//9xxx dp[i][2]=dp[i-1][2]*10+dp[i-1][1];// x49x 49xx 有49 } int T; scanf("%d",&T); while(T--) { int num[20]; long long a;int len=1; scanf("%lld",&a); a++; memset(num,0,sizeof(num)); while(a) { num[len++]=a%10; a/=10; } int flag=0;int last=0;long long sum=0; for(int i=len;i>=1;i--) { sum+=dp[i-1][2]*num[i];//加上 if(flag)// 开头是49 后面的全是 { sum+=dp[i-1][0]*num[i];//49xx } if(!flag && num[i]>4)//开头不是 49 开头大于4 那么就一定包含 49 { sum+=dp[i-1][1];//52xx } if(last==4 && num[i]==9)//为了49xx { flag=1; } last=num[i]; } printf("%lld\n",sum); } return 0; }
数位DP HDU 3555
最新推荐文章于 2020-04-29 12:04:46 发布
本文通过一个具体的示例介绍了如何使用C++结合动态规划解决特定类型的问题,特别是涉及数字序列处理的情况。代码中使用了多种C++标准库,并定义了一个最大值计算函数来辅助动态规划过程。
493

被折叠的 条评论
为什么被折叠?



