中石油训练赛 - sciorz画画(区间dp)

题目描述

众所周知,sciorz会画画。某天,sciorz画了一个凸多边形,这个多边形的每个顶点都有一个权值a[i]。sciorz觉得这个凸多边形不够美丽,于是他决定在n个点之间连线,最终用n-3条不相交的线将这个凸n边形分割成n-2个三角形。sciorz认为,一个三角形的美丽值是三个顶点权值的乘积,凸多边形的美丽值是其内部三角形的美丽值的和。sciorz想找到一种分割方案,使得这个凸多边形的美丽值最大。sciorz忙着刷难题,所以他随手就把这个签到题扔给你,希望你帮sciorz算出最大的美丽值。

输入

第一行一个t,表示有t组样例。
每组样例的第一行是一个n,表示多边形的边数。
第二行n个数,第i个数表示多边形第i个顶点的权值a[i],按逆时针顺序给出。

输出

对于每组样例,输出一行。格式为"Case #x: y",x为样例编号,y为答案。

样例输入 Copy

2
3
1 2 3 
4
1 2 3 4

样例输出 Copy

Case #1: 6
Case #2: 32

提示

第一个样例只有一个三角形,所以不用分割,答案是1*2*3=6。
第二个三角形,最优分割方案是分割为1 2 4和2 3 4两个三角形,答案是1*2*4+2*3*4=32

1<=t<=100
3<=n<=100
1<=a[i]<=100


题目分析:比赛的时候以为是个贪心题,于是就去切了,WA了几发后意识到事情并不是这么简单,但自己也没什么办法,就放弃了,赛后补题的时候知道了这原来是个区间dp,因为给出的点权是按照凸包的逆时针给出的,也就是可以用区间表示,且数据范围较小,加上题目要求最优解,也就可以用区间dp来解决了,设dp[ i ][ j ]为以点 i 为起点,点 j 为终点,围成的凸多边形中划分三角形得到的最优解,那么不难发现如果选取中间点 k 后,整个凸多边形分为了三个部分:

  1. 点 i 和点 k 组成的凸多边形
  2. 点 j 和点 k 组成的凸多边形
  3. 点 i 点 j 和点 k 组成的三角形

既然这样出现了三角形,显然同样可以从 len = 3 时开始递推,最后dp[ 1 ][ n ]就是答案了

代码:
 

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
using namespace std;
       
typedef long long LL;
      
typedef unsigned long long ull;
       
const int inf=0x3f3f3f3f;
  
const int N=110;
 
int dp[N][N],a[N];
 
int main()
{
#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//  freopen("output.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);
    int w;
    cin>>w;
    int kase=0;
    while(w--)
    {
        memset(dp,0,sizeof(dp));
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",a+i);
        for(int len=3;len<=n;len++)
            for(int l=1;l+len-1<=n;l++)
            {
                int r=l+len-1;
                for(int k=l+1;k<r;k++)
                    dp[l][r]=max(dp[l][r],dp[l][k]+dp[k][r]+a[l]*a[k]*a[r]);
            }
        printf("Case #%d: %d\n",++kase,dp[1][n]);
    }
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    return 0;
}
发布了691 篇原创文章 · 获赞 27 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_45458915/article/details/104781090
今日推荐