当前位置: 首页 > news >正文

石子合并2(环形求最优解 区间dp)

题目描述

在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。

试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分.

输入输出格式

输入格式:

 

数据的第1行试正整数N,1≤N≤100,表示有N堆石子.第2行有N个数,分别表示每堆石子的个数.

 

输出格式:

 

输出共2行,第1行为最小得分,第2行为最大得分.

 

输入输出样例

输入样例#1:  复制
4
4 5 9 4
输出样例#1:  复制
43
54
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<map>
#include<cmath>
#define Inf 0x3f3f3f3f
const int maxn=1e5+5;
typedef long long ll;
using namespace std;
int a[205],g[205][205],sum[205];
int dp[205][205];
int dp2[205][205];
int main()
{
   int n;
   cin>>n;
   for(int t=1;t<=n;t++)
   {
       scanf("%d",&a[t]);
       a[n+t]=a[t];
   }
   for(int t=1;t<=2*n;t++)
   {
       sum[t]=sum[t-1]+a[t]; 
   }
   memset(dp,Inf,sizeof(dp));
   memset(dp2,0,sizeof(dp2));
   for(int t=1;t<=2*n;t++)
   {
       for(int j=t;j<=2*n;j++)
       {
           g[t][j]=sum[j]-sum[t-1];
    }
   }
   
   for(int t=1;t<=2*n;t++)
   {
       dp[t][t]=0;
   }
   for(int l=1;l<2*n;l++)
   {
       for(int j=1;j+l<=2*n;j++)
       {
           int r=j+l;
           for(int k=j;k<r;k++)
           {
               dp[j][r]=min(dp[j][r],dp[j][k]+dp[k+1][r]+g[j][k]+g[k+1][r]); 
               dp2[j][r]=max(dp2[j][r],dp2[j][k]+dp2[k+1][r]+g[j][k]+g[k+1][r]); 
        }
    }
   }
   int ans=Inf;
   int ans1=0;
   for(int t=1;t<=n;t++)
   {
       ans=min(ans,dp[t][t+n-1]);
   }
   for(int t=1;t<=n;t++)
   {
       ans1=max(ans1,dp2[t][t+n-1]);
   }
   cout<<ans<<endl;
   cout<<ans1<<endl;
   return 0;
}

 

转载于:https://www.cnblogs.com/Staceyacm/p/11228511.html

相关文章:

  • 恢复系统管理员密码的五大奇招
  • P1082 同余方程(拓展欧几里德)
  • Mac下eclipse安装SVN插件
  • 程序员真的很懒
  • 【Android应用开发】-(9)应用程序安装卸载原理
  • TCP/IP:网络因此互联
  • 公式输入较好的参考
  • K - Queries for Number of Palindromes(区间dp+容斥)
  • ASP.Net WebForm温故知新学习笔记:二、ViewState与UpdatePanel探秘
  • IDEA等全家桶设置Ctrl+滚轮调整字体大小
  • 怎样卸载外壳扩展的DLL?
  • 具有自动恢复功能的通知栏图标控件
  • Win7编程:在按钮中加入管理员权限运行
  • 反射概念
  • Office 2010 中的数字签名
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • C++入门教程(10):for 语句
  • CSS相对定位
  • js算法-归并排序(merge_sort)
  • MySQL QA
  • oschina
  • Python进阶细节
  • SOFAMosn配置模型
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 前端设计模式
  • 由插件封装引出的一丢丢思考
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #微信小程序(布局、渲染层基础知识)
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (70min)字节暑假实习二面(已挂)
  • (C#)一个最简单的链表类
  • (差分)胡桃爱原石
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (一)基于IDEA的JAVA基础10
  • (原)本想说脏话,奈何已放下
  • *上位机的定义
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .net core 6 redis操作类
  • .net Stream篇(六)
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • @EnableWebMvc介绍和使用详细demo
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [BUUCTF]-PWN:wustctf2020_number_game解析(补码,整数漏洞)
  • [C++]Leetcode17电话号码的字母组合
  • [CC-FNCS]Chef and Churu
  • [DEBUG] spring boot-如何处理链接中的空格等特殊字符