P1063 能量项链

题目链接

 

 

Code:

 1 #include <bits/stdc++.h>
 2 # define LL long long
 3 using namespace std;
 4 
 5 const int maxn=100+10;
 6 int N;
 7 int val[maxn];
 8 int dp[maxn][maxn];
 9 
10 int pre(int i){
11     return i==1?N:i-1;
12 }
13 
14 int next(int i){
15     return i==N?1:i+1;
16 }
17 
18 int dfs(int left, int right){
19     if(dp[left][right]!=-1) return dp[left][right];
20 
21     int res=0;
22     for(int i=left;i!=right;i=next(i)){
23         int tmp=val[left]*val[next(i)]*val[next(right)]+dfs(left,i)+dfs(next(i),right);
24         res=max(res,tmp);
25     }
26     return dp[left][right]=res;
27 }
28 
29 int main(){
30     memset(dp,-1,sizeof(dp));
31     scanf("%d", &N);
32     for(int i=1;i<=N;++i){
33         scanf("%d", val+i);
34     }
35     int res=0;
36     for(int i=1;i<=N;++i){
37         res=max(res,dfs(i,pre(i)));
38     }
39     printf("%d", res);
40 }

 

bottom-up:

int e[250];
int dp[250][250];
int main(){
    int N;
    cin>>N;
    for(int i=1;i<=N;i++){
        scanf("%d", e+i);
        e[i+N]=e[i];
    }
    int res=0;
    for(int len=2;len<=N;len++){
        for(int i=1;len+i-1<2*N;i++){
            int j=len+i-1;
            for(int k=i;k<j;k++){
                dp[i][j]=max(dp[i][j], e[i]*e[k+1]*e[j+1]+dp[i][k]+dp[k+1][j]);
            }
        }
    }
    for(int i=1;i<=N;i++){
        res=max(res,dp[i][i+N-1]);
    }
    printf("%d", res);
   return 0;
}

 

posted @ 2020-02-01 15:04  feibilun  阅读(110)  评论(0)    收藏  举报