uva 11258 - String Partition

水dp

dp[i]表示从i到末尾的最大和

#include <iostream>

#include<cstdio>

#include<cstring>

#define INF 2147483647

using namespace std;

typedef long long ll;

ll dp[205],n;

char s[205];

ll DP(int i)

{

    if(dp[i]!=-1)

    return dp[i];



    if(i==n)

    return dp[i]=0;

    if(s[i]=='0')

    return dp[i]=DP(i+1);

    ll v=0;

    for(int k=1;k<=10;k++)

    {

        if(i+k>n)

        break;

        v=v*10+s[i+k-1]-'0';

        if(v>INF)

        break;

        else

        dp[i]=max(dp[i],v+DP(i+k));

    }

    return dp[i];

}

int main()

{

    int t;

    scanf("%d",&t);

    while(t--)

    {

        scanf("%s",s);

        n=strlen(s);

        memset(dp,-1,sizeof(dp));

        printf("%lld\n",DP(0));

    }

    return 0;

}

你可能感兴趣的:(partition)