题目大意:给你一个数字 n 接下来再输入一个数字 w(<10^60),表示w这个数字是 n 进制的,
并且超过十进制也用数字表示,这样就有多种组合了,问你所有组合中(划分方案中)原来的
数字十进制最小是多少。
思路:网上说可以用贪心做,但是我感觉那个贪心比较奇怪,不是很理解,还是用dp靠谱。
用dp[ i ] 表示从到第 i 个数字为止,最小十进制数最小是多少。
初始状态 dp[ 0 ]=0。然后我们枚举起点向后更新。
#include<bits/stdc++.h> #define ll long long using namespace std; const ll inf=1e18; char s[100]; int n; ll dp[100]; int main() { cin>>n; scanf("%s",s+1); int len=strlen(s+1); for(int i=1;i<=len;i++) dp[i]=inf; dp[0]=0; for(int i=1;i<=len;i++) { if(s[i]=='0')//起始值不能为0,所以单独一位。 { dp[i]=min(dp[i],n*dp[i-1]); continue; } ll now=0; for(int j=i;j<=len;j++) { now=now*10+s[j]-'0'; if(now>=n) break; //超过n了 if((inf-now)/n>=dp[i-1]) dp[j]=min(dp[j],dp[i-1]*n+now);// 不能直接用dp[i-1]*n+now判断,会爆long long } } cout<<dp[len]<<endl; return 0; }
ps:以后遇到划分的问题,尽量考虑dp!!!!!