学无止境~
平行四边形优化为啥成立还在思考中~
//石子问题 平行四边形优化
#include<iostream>
#define maxn 1002
#define inf 0x3fffffff
#define min(a,b) a<b?a:b
using namespace std;
int n;
int a[maxn],dp[maxn][maxn],p[maxn][maxn],sum[maxn];
int main(){
scanf("%d",&n);
sum[0] = 0;
for(int i = 1;i<=n;i++){
scanf("%d",&a[i]);
dp[i][i] = 0;
p[i][i] = i;
sum[i] = sum[i-1]+a[i];
}
for(int c = 1;c<n;c++){
for(int i = 1;i<=n-c;i++){
int val = inf,j = i+c,kk;
int total = sum[j]-sum[i-1];
for(int k = p[i][i+c-1];k<=p[i+1][i+c]&&k<j;k++){
if(dp[i][k]+dp[k+1][j]+total<val){
val = dp[i][k]+dp[k+1][j]+total;
kk = k;
}
}
dp[i][j] = val;
p[i][j] = kk;
// cout<<i<<" "<<j<<" "<<kk<<" "<<dp[i][j]<<endl;
}
}
printf("%d\n",dp[1][n]);
return 0;
}