[CodeForces-758D] 区间dp

Input

16
11311

Output

475

Input

20
999

Output

3789

Input

17
2016

Output

594

Note

In the first example 12 could be obtained by converting two numbers to the system with base 13: 12 = 12·130 or 15 = 1·131 + 2·130.

参考https://vjudge.net/solution/10117143和http://www.cnblogs.com/TreeDream/p/6322755.html
题意:一个n进制下的数k,其中k不会用字母,如果有A就用10代替了。求k这个数对应的,在10进制下最小的数。

#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const ll INF=(1LL<<62)-1;
char s[105];
ll dp[105];
int main()
{
    int n;
    scanf("%d%s",&n,s+1);
    int len=strlen(s+1);
    for(int i=0; i<=len; i++)
        dp[i]=INF;
    dp[0]=0;
    for(int i=1; i<=len; i++)
    {
        ll now=0;
        for(int j=i; j<=len; j++)
        {
            now=now*10+s[j]-'0';
            if(now>=n)break;
            if(s[i]=='0' && j>i)break;
            if(1.0*dp[i-1]*n+now>2e18)continue;
            dp[j]=min(dp[j],dp[i-1]*n+now);
        }
    }
    printf("%lld",dp[len]);
    return 0;
}

你可能感兴趣的:(区间dp)