题目 :https://www.cnblogs.com/Renyi-Fan/archive/2017/06/09/6970166.html#_label1
#include<bits/stdc++.h>
using namespace std;
int dp[1005][1005],num[1005][1005],a[1005],n,m;
int main(){
while(scanf("%d%d",&n,&m)){
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
dp[i][j]=0x3f3f3f3f;//数组初始化为最大
}
for(int i=1;i<=n;i++){
num[i][i]=a[i];
for(int j=i+1;j<=n;j++){
num[i][j]=num[i][j-1]*10+a[j];
}
}//用二位数组存储
for(int i=1;i<=n;i++)
dp[0][i]=num[1][i];
//初始化为 没有括号的状态
for(int i=1;i<=m;i++)
for(int j=i+1;j<=n;j++)
for(int k=i;k<=j;k++)//类似于滚动数组
dp[i][j]=min(dp[i][j],dp[i-1][k]+num[k+1][j]);
cout<<dp[m][n]<<endl;
}
}