pku2033--Alphacode(zjgsu1216) 递推

本文提供两段使用动态规划解决字符串解码问题的代码实现。针对不同输入限制,通过递推方式计算字符串的有效解码方法数量,并处理特殊边界条件。

用递推,

对当前考虑的第i位进行考虑,表达成i-1或i-2的关系式

今天做这两道题目花了很多时间,不想写了,代码核心部分看看很容易懂的

代码如下:

 

ContractedBlock.gifExpandedBlockStart.gifpku2033
#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;
}

 

 

ContractedBlock.gifExpandedBlockStart.gifzjgsu1216
#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;
}

转载于:https://www.cnblogs.com/pandy/archive/2008/11/22/1339080.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值