hdu 18651sting 01背包

来源:互联网 发布:林小宅扒皮 知乎 编辑:程序博客网 时间:2024/06/03 08:09

http://acm.hdu.edu.cn/showproblem.php?pid=1865

思路:假设我们已经知道前N个数的解,这时我们求N+1个数的解可以分为两个部分,即最后一个数为1,则可得到次数目为N个数的解1,最后一个数位2,则可得到此数目为N-1个数的解,得到状态转移方程为dp[i]=dp[i-1]+dp[i-2];

此题我错了2次,究其原因为我在大数相加时,进位数加错了;我觉得避免以后出错的方法为两个数相加,可以转化为3个数相加,即多一个数d,它记录进位的值

一下是我的错误代码:d=sum/10;

正确代码为: d=(sum+d)/10;

我的代码为;

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 500+10


char str[maxn];
int array3[maxn][maxn];
int T;


int main()
{
    int len;
    int i,j,sum;
    int d;
    memset(array3,0,sizeof(array3));
    array3[1][0]=1;
    array3[2][0]=2;
    for(i=3;i<maxn;i++)
    {
        d=0;
        for(j=0;j<maxn;j++)
        {
            sum=(array3[i-1][j]+array3[i-2][j]);
            array3[i][j]=(sum+d)%10;
            d=(sum+d)/10;
        }
    }

    scanf("%d",&T);
    while(T--)
    {
        scanf("%s",str);
        len=strlen(str);
        for(i=maxn-1;i>=0;i--)
            if(array3[len][i]!=0)
                break;
        for(;i>=0;i--)
            printf("%d",array3[len][i]);
        printf("\n");
    }
    return 0;
}



0 0
原创粉丝点击