没有链接。
题目大意就是给你一个长度为n只包含数字的串,然后给你m的加号,在满足合法的前提下,求加法表达式的最小值
设dp[m][n]表示向长度为n的串加入m个加号所获得的最小值
转移方程就是:
if(i==0)dp[i][j]=Num(1,j);//串的下表从1开始Num(l,r)表示获得子串[l,r]
else if(i+1>j)dp[i][j]=maxn;//表达式不合法,加号的个数应该小于等于数字的个数-1
else dp[i][j]=min(dp[i-1][k]+Num(k+1,j))//k(i,j-1),为啥不是j,要是j的话最后一个加号没地方放了
//dp500-5
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int SIZE=1e3+10;
const int MOD=1000000007;
const int maxn=1<<30;
char s[SIZE];
int dp[SIZE][SIZE];
int Num(int l,int r){
int ret=0;
while(l<=r){
ret=ret*10+s[l++]-'0';
}
return ret;
}
int main()
{
int m;
while(scanf("%s",s+1)!=EOF){
scanf("%d",&m);
int len=strlen(s+1);
for(int i=0;i<=m;i++)
for(int j=1;j<=len;j++){
if(i==0)dp[i][j]=Num(1,j);
else if(i+1>j)dp[i][j]=maxn;
else {
int Min=maxn;
for(int k=i;k<=j-1;k++)
if(dp[i-1][k]+Num(k+1,j)<Min)Min=dp[i-1][k]+Num(k+1,j);
dp[i][j]=Min;
}
}
printf("%d\n",dp[m][len]);
}
return 0;
}