题意:给出n个数字,求出最小组合和,1 2 3 4 => 3 3 4(3) => 6 4(9) => 10(19) 1 2 3 4 => 1 5 4(5) => 1 9(14) => 10(24) 1 2 3 4 => 1 2 7(7) => 3 7(10) => 10(20) 。
区间dp,dp[i][j]表示 从i到j最小的和,dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]+ )
ps: 求和可以通过前缀和提前处理掉。
#include<bits/stdc++.h>
using namespace std;
int dp[105][105];
int sum[105];
int INF = 1e9+5;
int main(){
int n;
scanf("%d",&n);
for(int i = 1;i<=n;i++){
int x;
scanf("%d",&x);
sum[i] = sum[i-1]+x;
}
for(int l = 2;l<=n;l++){
for(int i = 1;i<=n-l+1;i++){
int j = i+l-1;
dp[i][j] = INF;
for(int k = i;k<=j;k++){
dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);
}
}
}
cout<<dp[1][n]<<endl;
}