P1063 能量项链

题意:给出n个珠子,围成一圈,相邻位置相碰可以产生能量

     每一个珠子都有两个能量值,可以定义为前跟后

       一开始,前为其本身,后为其本身+1的位置的能量

          相邻位置碰撞产生的能量为:前*后*前

            碰撞后这两颗珠子融为一体,前为前者的前,后为后者的后

  问:可以产生的最大能量为?

思路:很明显,不同的碰撞方式产生的能量不同;并且这是个圈圈;

    所以我们要此数组后面再加一遍 (模拟圈)

      然后就开始区间dp,长度从2到n进行枚举即可;

        每一次枚举一个区间dp【i】【j】,这个区间形成的珠子,“前”为a[i],“后”为a[j+1](试着模拟一下就会知道是这样)

          最后我们再枚举一下哪一个区间答案最大即可

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=2e2+10;
 4 int dp[maxn][maxn];
 5 int a[maxn];
 6 int main()
 7 {
 8     int n;
 9     scanf("%d",&n);
10     for(int i=1;i<=n;i++){
11         scanf("%d",&a[i]);
12         a[i+n]=a[i];
13     }
14     for(int len=1;len<n;len++){
15         for(int i=1;i<=2*n;i++){
16             int j=i+len;
17             if(j<=2*n){
18                 for(int k=i+1;k<=j;k++){
19                     dp[i][j]=max(dp[i][j],dp[i][k-1]+dp[k][j]+a[i]*a[k]*a[j+1]);
20                 }
21             }
22            // printf("%d ",dp[i][j]);
23         }
24        // printf("\n");
25     }
26     int ans=0;
27     for(int i=1;i<=n;i++)
28         ans=max(ans,dp[i][n+i-1]);
29     printf("%d\n",ans);
30     return 0;
31 }
View Code

 

posted @ 2020-03-23 16:57  古比  阅读(107)  评论(0编辑  收藏  举报