#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=20;
long long dp[N][3],a[N];
int T;
long long n;
void init(){
dp[0][0]=1;
for(int i=1;i<N;i++){
dp[i][0]=dp[i-1][0]*10-dp[i-1][1];
dp[i][1]=dp[i-1][0];
dp[i][2]=dp[i-1][2]*10+dp[i-1][1];
}
}
int main(){
cin>>T;
init();
while(T--){
cin>>n;
n++;
int len=0,last=0;
long long ans=0;
bool flag=false;
memset(a,0,sizeof(a));
while(n){
a[++len]=(long long)n%10;
n/=10;
}
for(int i=len;i>=1;i--){
ans+=dp[i-1][2]*a[i];
if(flag){
ans+=dp[i-1][0]*a[i];
}
if(!flag && a[i] > 4){
ans+=dp[i-1][1];
}
if(9 == a[i] && 4 == last){
flag=true;
}
last=a[i];
}
cout<<ans<<endl;
}
return 0;
}
HDU 3555Bomb数位dp
最新推荐文章于 2021-01-22 20:25:28 发布
本文介绍了一个使用C++实现的动态规划算法案例,通过预处理数组dp来解决一类数值计算问题。该算法首先初始化dp数组,然后通过输入的长整型数n进行递推计算,最终输出计算结果。
455

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



