Description
给出一个长度为 n n 的数字串,首先随机确定一个数字 b1(0≤bi≤9) b 1 ( 0 ≤ b i ≤ 9 ) ,之后令 bi=⌊bi−1+ai2⌋ b i = ⌊ b i − 1 + a i 2 ⌋ 或 ⌈bi−1+ai2⌉ ⌈ b i − 1 + a i 2 ⌉ , 2≤i≤n 2 ≤ i ≤ n ,以此确定数字串 b b ,问不同的串数量(不包括 a a )
Input
一个长度不超过的数字串 a a
Output
输出不同的串数量
Sample Input
12345
Sample Output
48
Solution
以 dp[i][j] d p [ i ] [ j ] 表示使得 bi=j b i = j 的 b1...bi b 1 . . . b i 个数,则 dp[1][0...9]=1 d p [ 1 ] [ 0...9 ] = 1 ,令 k=⌊j+ai+12⌋,l=⌈j+ai+12⌉ k = ⌊ j + a i + 1 2 ⌋ , l = ⌈ j + a i + 1 2 ⌉ ,根据第 bi+1 b i + 1 的选取有转移:
dp[i+1][k]+=dp[i][j],dp[i+1][l]+=dp[i][j](l≠k) d p [ i + 1 ] [ k ] + = d p [ i ] [ j ] , d p [ i + 1 ] [ l ] + = d p [ i ] [ j ] ( l ≠ k )
∑i=09dp[n][i] ∑ i = 0 9 d p [ n ] [ i ] 即为答案,注意如果 a a 序列满足或 ai=⌈ai−1+ai2⌉ a i = ⌈ a i − 1 + a i 2 ⌉ 则答案需要减一
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int INF=0x3f3f3f3f,maxn=100001;
int n,a[55];
ll dp[55][10];
char s[55];
int main()
{
scanf("%s",s+1);
n=strlen(s+1);
for(int i=1;i<=n;i++)a[i]=s[i]-'0';
for(int i=0;i<10;i++)dp[1][i]=1;
for(int i=1;i<n;i++)
for(int j=0;j<10;j++)
{
int k=(j+a[i+1])/2,l=(j+a[i+1]+1)/2;
dp[i+1][k]+=dp[i][j];
if(k!=l)dp[i+1][l]+=dp[i][j];
}
ll ans=0;
for(int i=0;i<10;i++)ans+=dp[n][i];
int flag=1;
for(int i=2;i<=n;i++)
{
if((a[i-1]+a[i])/2==a[i]||(a[i-1]+a[i]+1)/2==a[i])continue;
else
{
flag=0;
break;
}
}
printf("%I64d\n",ans-flag);
return 0;
}