概念就不赘述了。
#include<bits/stdc++.h> using namespace std; double a[10],b[10]; double dp[10][10]; int s[10][10]; double w[10][10]; void print(int i,int j) { if(i > j) return ; printf("%d ",s[i][j]); print(i,s[i][j]-1); print(s[i][j]+1,j); } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%lf",&a[i]); } for(int i=1;i<=n+1;i++) { scanf("%lf",&b[i]); } for(int i=0;i<=n;i++) { w[i+1][i] = b[i]; dp[i+1][i] = 0; } for(int r=0;r<n;r++) { for(int i =1;i<=n-r;i++) { int j = i + r; w[i][j] = w[i][j-1]+a[j]+b[j]; dp[i][j] = dp[i+1][j]; s[i][j] = i; for(int k = i+1;k<=j;k++) { int t = dp[i][k-1]+dp[k+1][j]; if(t<dp[i][j]) { dp[i][j] = t; s[i][j] = k; } } dp[i][j] += w[i][j]; } } printf("\n%lf\n\n",dp[1][n]); for(int i =1;i<=n;i++) { for(int j = 1;j<=n;j++) printf("%lf ",dp[i][j]); printf("\n"); } for(int i =1;i<=n;i++) { for(int j = 1;j<=n;j++) printf("%d ",s[i][j]); printf("\n"); } printf("\n\n"); print(1,n); } /* 3 0.5 0.1 0.05 0.15 0.1 0.05 0.05 */