在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; }