我从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;
}
使用自上而下的DP.Memoization为k = 1或k = 2的每个索引值。