1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 #include<cmath> 8 using namespace std; 9 #define Maxn 1010 10 #define INF 0xfffffff 11 12 int a[2*Maxn],sum[2*Maxn]; 13 int f[2*Maxn][2*Maxn],s[2*Maxn][2*Maxn]; 14 15 int mymin(int x,int y) {return x<y?x:y;} 16 17 int main() 18 { 19 int n; 20 while(scanf("%d",&n)!=EOF) 21 { 22 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 23 for(int i=1;i<=n;i++) a[i+n]=a[i]; 24 sum[0]=0; 25 for(int i=1;i<=2*n;i++) sum[i]=sum[i-1]+a[i]; 26 memset(f,63,sizeof(f)); 27 for(int i=1;i<=2*n;i++) f[i][i]=0,s[i][i]=i; 28 for(int i=2*n;i>=1;i--) 29 for(int j=i+1;j<=2*n;j++) 30 { 31 if(j-i+1>n) break; 32 for(int k=s[i][j-1];k<=s[i+1][j];k++) 33 { 34 if(f[i][j]>f[i][k]+f[k+1][j]+sum[j]-sum[i-1]) 35 { 36 f[i][j]=f[i][k]+f[k+1][j]+sum[j]-sum[i-1]; 37 s[i][j]=k; 38 } 39 } 40 } 41 int ans=INF; 42 for(int i=1;i<=n;i++) ans=mymin(ans,f[i][i+n-1]); 43 printf("%d ",ans); 44 } 45 return 0; 46 }
其实就是个区间DP的优化,环形石子,把它拆成链就好了【在右面copy一倍】
四边形不等式优化DP
2016-11-18 08:51:01