1. 程式人生 > >P1063-能量項鍊【區間dp】

P1063-能量項鍊【區間dp】

正題

題目大意

有n個珠子組成環,每顆珠子的頭尾標記連線,將兩顆珠子合併會產生headiheadjtailj的能量,產生一顆頭標記為頭珠子的頭標記,尾標記為尾珠子的尾標記。 求所以珠子合併最大能量

解題思路

裸的區間dp

code

#include<cstdio>
#include<algorithm>
using namespace std;
int n,h[210],t[210],maxs,f[210][210];
int main()
{

    scanf("%d",&n);
    for(int i=1;i<=n;i++)
{ scanf("%d",&h[i]); h[i+n]=t[i+n-1]=t[i-1]=h[i]; } t[2*n]=h[1]; for(int i=2;i<=n;i++) for(int l=1;l<=2*n-i+1;l++) { int r=l+i-1; for(int k=l;k<r;k++) { f[l][r]=max(f[l][r],f[l][k]+f[k+1][r]+h[l]*t[k]*t[r]);
//動態轉移 } if(i==n) maxs=max(maxs,f[l][r]); } printf("%d",maxs); }