在N进制下给你一个数,要你转换成最小的十进制数;
状态转移方程:从前向后
dp[j]表示j位前数列的最小十进制数
dp[j]=min(dp[j],dp[i]*n+x)
程序:
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
char s[1000];
long long dp[1000];
int main()
{
long long n;
scanf("%I64d",&n);
scanf("%s",s);
int len=strlen(s);
for(int i=1;i<=len;i++)
dp[i]=2e18;
dp[0]=0;
for(int i=0;i<len;i++)
{
if(s[i]=='0')
{
if(dp[i]>2e18/n)continue;
dp[i+1]=min(dp[i+1],dp[i]*n);
continue;
}
long long x=0;
for(int j=i+1;j<=len;j++)
{
x=x*10+(s[j-1]-'0');
if(x>=n)break;
if(dp[i]>2e18/n)continue;
dp[j]=min(dp[j],dp[i]*n+x);
}
}
printf("%I64d
",dp[len]);
return 0;
}