我从 spoj 尝试了这个问题 ACODE。如果你能建议我,我的方法可能有什么问题!问题链接:http ://www.spoj.com/problems/ACODE/
我的做法:
typedef long long ll;
ll dp[27][3];
ll acode(char *A,int n,int k)
{
if(k==0)
{
ll x,y;
x=acode(A,n,1);
y=acode(A,n,2);
return (x+y);
}
if(n<0)
return 0;
else if(n==0)
{
if(k==1)
return 1;
else
return 0;
}
if(dp[n][k] != 0)
return dp[n][k];
int m;
if(k==1)
m=A[n]-'0';
else
m=10*(A[n-1]-'0')+(A[n]-'0');
if(m<27 && m!=0)
{
if(k==1)
dp[n][k] = acode(A,n-1,1)+acode(A,n-1,2);
else
dp[n][k] = acode(A,n-2,1)+acode(A,n-2,2);
}
return dp[n][k];
}
int main()
{
char A[5001];
cin>>A;
cout<<A;
while(strcmp(A,0))
{
int l = strlen(A);
cout<<acode(A,l-1,0)<<endl;
cin>>A;
}
return 0;
}
对 k=1 或 k=2 的每个索引值使用自上而下的 DP.Memoization。