题解(递归)
详细思路见代码块
#include<iostream>
#include<string>
using namespace std;
long long num[1000][1000]; //num[i][j]存第i位到第j位组成的数字大小
long long minn(int m,int n); //表示在n个数中插入m个加号的最小值
int main()
{
int m;
while(cin>>m)
{
string n;
cin>>n;
n=' '+n; //使下标从1开始
for(int i=1;i<n.length();i++)
{
num[i][i]=(n[i]-'0'); //每一位的数字大小
for(int j=i+1;j<n.length();j++)
{
num[i][j]=num[i][j-1]*10+(n[j]-'0');
}
}
cout<<minn(m,n.length()-1)<<endl;
}
}
long long minn(int m,int n)
{
if(m==0) return num[1][n]; //当m(加号数量)为0时,此时的值就是从第一位到第n位
else if(m>n-1) return 1<<30; //此时放不下所有的加号返回一个极大值
else
{
long long temp=1<<30;
for(int i = m;i <= n-1;i++)
temp = min(temp, minn(m-1,i)+num[i+1][n]); //加号放入第i位后,num[i+1][n]表示的是加号后面的数字大小
return temp;
}
}