P1063 能量項鍊

好吧此次換比較正常的傳送門嚶嚶嚶
首先感嘆一下這竟然是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

相關文章
相關標籤/搜索