有一个由1..9组成的数字串.问如果将m个加
号插入到这个数字串中,在各种可能形成的
几个数的最小值;可得dp[m][j]=dp[m-1][m->j-1]+sum(a[m+1->j]);
号插入到这个数字串中,在各种可能形成的
表达式中,值最小的那个表达式的值是多少?
思路:设定dp[i][j],i表示为加号的个数,j表示到达数组的第
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1000+10;
char s[maxn];
int d[maxn][maxn];
int num(int i,int j)
{
int ans=0;
for(int k=i;k<=j;k++)
ans=ans*10+s[k]-'0';
return ans;
}
int mul(int m,int n)
{
int ans=1000000000;
if(m+1>n) return 1000000000;
if(m==0) return d[1][n];
for(int i=n-1;i>=m;i--)
{
int sum=mul(m-1,i)+d[i+1][n];
ans=min(ans,sum);
}
return ans;
}
int main()
{
int ans,m;
scanf("%s",s+1);
int len=(int)strlen(s+1);
for(int i=1;i<=len;i++)
{
for(int j=i;j<=len;j++)
{
d[i][j]=num(i,j);
}
}
scanf("%d",&m);
ans=mul(m,len);
printf("%d\n",ans);
return 0;
}
几个数的最小值;可得dp[m][j]=dp[m-1][m->j-1]+sum(a[m+1->j]);
考察点:能正确找到状态转移,然后看看是否符合dp的特性
收获:任何时候都不能放弃,我做这道题纠结了我3天;
经验:我要想提高自己的成绩必须放弃功名,把算法当成艺术,
算法是一种艺术;