给定一个长度不超过60的n进制的数,字母用数字代替,求它在十进制情况下的最小值
dp[i]表示取前i个数时获得的最小值
注意不要爆INF
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
typedef long long ll;
using namespace std;
const int MAX = 60+10;
const ll INF = 1e18;
char s[MAX];
int n;
ll dp[MAX];
int main()
{
cin>>n>>s;
int len = strlen(s);
for(int i = 1; i<=len; ++i)
dp[i] = INF;
dp[0] = 0;
// cout<<"len="<<len<<endl;
for(int i = 0; i<len; ++i)
{
if(s[i]=='0')
{
dp[i+1] = min(dp[i+1], n*dp[i]);
continue;
}
ll x = 0;
for(int j = i; j<len; ++j)
{
// cout<<i<<" "<<j<<endl;
x = x*10+s[j]-'0';
if(x>=n)break;
if((INF-x)/n>=dp[i])
dp[j+1] = min(dp[j+1], x+n*dp[i]);
}
}
cout<<dp[len]<<endl;
return 0;
}