用递推,
对当前考虑的第i位进行考虑,表达成i-1或i-2的关系式
今天做这两道题目花了很多时间,不想写了,代码核心部分看看很容易懂的
代码如下:
pku2033
#include<stdio.h>
#include<string.h>
char s[10005];
__int64 dp[10005];
void process()
{
int len=strlen(s),i,temp;
dp[0]=1;
for(i=1;i<len;i++)
{
temp=(s[i-1]-'0')*10+s[i]-'0';
if(s[i]=='0')
{ if(i==1)
dp[i]=1;
else
dp[i]=dp[i-2];
}
else if(s[i-1]=='0'||temp>26)
dp[i]=dp[i-1];
else if(temp>9&&temp<=26)
{ if(i==1)
dp[i]=2;
else
dp[i]=dp[i-1]+dp[i-2];
}
}
printf("%I64d\n",dp[len-1]);
}
int main()
{
while(scanf("%s",s),s[0]!='0')
{
process();
}
return 0;
}
zjgsu1216
#include<stdio.h>
#include<string.h>
char s[502];
__int64 d;
__int64 dp[502];
void process()
{
int i,temp,flag=0;
dp[0]=1;
for(i=1;i<strlen(s);i++)
{
temp=(s[i-1]-'0')*10+s[i]-'0';
if(s[i-1]=='0'||temp>=26)
dp[i]=dp[i-1];
else if(temp<=25&&temp>9)
{
if(i==1)
dp[i]=2;
else
dp[i]=dp[i-1]+dp[i-2];
}
if(dp[i]>d)
{
printf("NO\n");
flag=1;break;
}
}
if(flag==0)
printf("ACCEPT\n");
}
int main()
{
while(scanf("%s%I64d",s,&d)!=EOF)
{
process();
}
return 0;
}