好吧此次換比較正常的傳送門嚶嚶嚶
首先感嘆一下這竟然是06年TG第一題!!感受個人信心受到了暴擊好伐。。。
那麼做爲區間dp的近乎模板題,且n的值也不大,因此三重循環徹底能夠A掉這道題,那麼第一重循環區間的長度l,第二重循環區間開始的下標i,由這兩重循環,咱們能夠求出區間結束的下標j=i+l,而第三重則循環由i到j-1的每個下標k,狀態轉移方程則爲dp[i][j]=ma(dp[i][k]+dp[k+1][j]+a[i]a[k+1]a[j+1],dp[i][j])
那麼還有一點須要注意的是,因爲這道題的題目說了這是一個環,so咱們須要將原序列又n個值擴充至2n個值,輸出時則尋找的dp[i][i+n]中的最大值ios
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 8 int n,ans; 9 int a[305],dp[305][305]; 10 11 int ma(int a,int b){return a>b?a:b;} 12 int mi(int a,int b){return a<b?a:b;} 13 14 int main(){ 15 scanf("%d",&n); 16 for(int i=1;i<=n;i++){ 17 scanf("%d",&a[i]); 18 a[i+n]=a[i]; 19 } 20 for(int l=1;l<n;l++){ 21 for(int i=1,j=i+l;i<n+n&&j<n+n;i++,j=i+l){ 22 for(int k=i;k<j;k++){ 23 dp[i][j]=ma(dp[i][k]+dp[k+1][j]+a[i]*a[k+1]*a[j+1],dp[i][j]); 24 } 25 } 26 } 27 for(int i=1;i<=n;i++){ 28 ans=ma(ans,dp[i][n+i-1]); 29 } 30 printf("%d\n",ans); 31 return 0; 32 }
嗯就是醬紫,應該仍是比較好理解的andspa
新人開博鼓勵一下吧。。code