NOI1995合并石子

合并石子

fmax[l][r]表示合并区间[l,r]的最大分值,

fmin[l][r]表示合并区间[l,r]的最小分值

for(k l~r-1)

  fmax[l][r]=max(fmax[l][r],fmax[l][k]+f[k+1][r]);

fmax[i]+=sum(l~r)

最小值同理

处理环形就把环搞成一个2倍长度的链,最后枚举长度为n的区间最大得分和最小得分

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #define ll long long
 5 using namespace std;
 6 const int MAXN = 210 ;
 7 ll n,s[MAXN][2],f[MAXN][MAXN];
 8 int main()
 9 {
10     scanf("%lld",&n);
11     for(int i=1;i<=n;i++)
12     {
13         scanf("%lld",&s[i][0]);
14         s[i-1+n][1]=s[i-1][1]=s[i+n][0]=s[i][0];
15     }
16     s[n<<1][1]=s[1][0];
17     for(int len=2;len<=n;len++)
18      for(int l=1;l+len-1<=(n<<1);l++)
19      {
20          int r=l+len-1;
21          for(int k=l;k<r;k++)
22           f[l][r]=max(f[l][r],f[l][k]+f[k+1][r]+s[l][0]*s[r][1]*s[k][1]);
23      }
24     ll ans=0;
25     for(int i=1;i<=n;i++)
26      ans=max(ans,f[i][i+n-1]);
27     printf("%lld\n",ans);
28     return 0;
29 }

猜你喜欢

转载自www.cnblogs.com/yjkhhh/p/8858571.html