【动态规划】 石子合并问题(环形) (ssl 1597)

石子合并问题石子合并问题

Description

在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。试设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分。

编程任务:

对于给定n堆石子,编程计算合并成一堆的最小得分和最大得分。

Input

输入包括多组测试数据,每组测试数据包括两行。

第1 行是正整数n,1<=n<=100,表示有n堆石子。

第2行有n个数,分别表示每堆石子的个数。

Output

对于每组输入数据,输出两行。

第1 行中的数是最小得分;第2 行中的数是最大得分。

Sample Input

4

4 4 5 9

Sample Output

43

54

题目大意:

有n堆石子,围成一个环,可以将相邻的两堆合在一起,两堆的重量之和为你的分数,要求最大分数和最小分数

解题方法:

建议先做完石子合并(非环形)题解,再做此题,本体我们有两种方法:

方法一方法一

我们先用一个二位数组f[i][j]来表示从第i对开始,后面的j个数的最小值(最大的用l),然后在后面复制一遍接下来就和石子合并差不多了

动态转移方程:

f[i][len]=min(f[i][len],f[i][k]+f[i+k][len−k]+s[i+len−1]−s[i−1])f[i][len]=min(f[i][len],f[i][k]+f[i+k][len-k]+s[i+len-1]-s[i-1])f[i][len]=min(f[i][len],f[i][k]+f[i+k][lenk]+s[i+len1]s[i1])
l[i][len]=max(l[i][len],l[i][k]+l[i+k][len−k]+s[i+len−1]−s[i−1])l[i][len]=max(l[i][len],l[i][k]+l[i+k][len-k]+s[i+len-1]-s[i-1])l[i][len]=max(l[i][len],l[i][k]+l[i+k][lenk]+s[i+len1]s[i1])

注释:

f[i][k]为前面,i+k是后面的开始,len-k是长度有len已经用了k,所以要减掉k,i+len-1是这一段的后面,因为第i个也要求,所以要减去i-1

#include<cstdio>
#include<iostream>
using namespace std;
int a[205],f[205][205],l[205][205],s[205],n,minn,maxx;
int main()
{memset(f,127/3,sizeof(f));scanf("%d",&n);for (int i=1;i<=n;i++){scanf("%d",&a[i]);s[i]=s[i-1]+a[i];f[i][1]=0;}for (int i=n+1;i<=n*2;i++){s[i]=s[i-1]+a[i-n];//复制一遍f[i][1]=0;}for (int len=2;len<=n;len++)//长度for (int i=1;i<=n*2-len;i++)//前面的数,n-len+1+n-1=n*2-lenfor (int k=1;k<len;k++)//分界线{f[i][len]=min(f[i][len],f[i][k]+f[i+k][len-k]+s[i+len-1]-s[i-1]);//求最小的l[i][len]=max(l[i][len],l[i][k]+l[i+k][len-k]+s[i+len-1]-s[i-1]);//求最大的}minn=2147483647;for (int i=1;i<=n;i++){minn=min(minn,f[i][n]);//最小的maxx=max(maxx,l[i][n]);//最大的}printf("%d\n%d",minn,maxx);
}

方法二方法二

我们不在后面加一段(f和l表示的一样),直接用mod的方法,超过你的直接从1开始往后,本做法详情看动态转移方程

动态转移方程

f[i][len]=min(f[i][len],f[i][k]+f[(i+k−1)modn+1][len−k]+fj(i,i+len−1));f[i][len]=min(f[i][len],f[i][k]+f[(i+k-1)modn+1][len-k]+fj(i,i+len-1));f[i][len]=min(f[i][len],f[i][k]+f[(i+k1)modn+1][lenk]+fj(i,i+len1));
l[i][len]=max(l[i][len],l[i][k]+l[(i+k−1)modn+1][len−k]+fj(i,i+len−1));l[i][len]=max(l[i][len],l[i][k]+l[(i+k-1)modn+1][len-k]+fj(i,i+len-1));l[i][len]=max(l[i][len],l[i][k]+l[(i+k1)modn+1][lenk]+fj(i,i+len1));

注释:

(i+k-1) mod n+1为什么不写成(i+k)mod n呢?因为当i+k=n时,结果为0,0不在我们的计算范围内,所以我们要用(i+k-1) mod n+1,用这种的话,当i+k=n时,结果为n。fj(i,i+len-1)为计算i到i+len-1之间的数

#include<cstdio>
#include<iostream>
using namespace std;
int a[105],f[105][105],l[105][105],s[105],n,minn,maxx;
int fj(int x,int y)
{if (y<=n) return s[y]-s[x-1];//没有超过nreturn fj(x,n)+fj(1,y-n);//分两段
}
int main()
{memset(f,127/3,sizeof(f));scanf("%d",&n);for (int i=1;i<=n;i++){scanf("%d",&a[i]);s[i]=s[i-1]+a[i];f[i][1]=0;}for (int len=2;len<=n;len++)//长度for (int i=1;i<=n;i++)//前面的for (int k=1;k<len;k++)//分界线{f[i][len]=min(f[i][len],f[i][k]+f[(i+k-1)%n+1][len-k]+fj(i,i+len-1));//状态转移方程l[i][len]=max(l[i][len],l[i][k]+l[(i+k-1)%n+1][len-k]+fj(i,i+len-1));//状态转移方程}minn=2147483647;for (int i=1;i<=n;i++){minn=min(minn,f[i][n]);//求最小的maxx=max(maxx,l[i][n]);//求最大的}printf("%d\n%d",minn,maxx);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P6102-[EER2]谔运算【位运算】

正题 题目链接:https://www.luogu.com.cn/problem/P6102?contestId26472 题目大意 nnn个数的序列aaa&#xff0c;求 ∑i1n∑j1n∑k1n∑l1n(aioraj)xor(akandal)\sum_{i1}^n\sum_{j1}^n\sum_{k1}^n\sum_{l1}^n(a_i\ or\ a_j)\ xor\ (a_k\ and\ a_l)i1∑n​j1∑n​k1∑n​l1∑n…

操作系统复习笔记 07 Process Synchronization 进程同步

背景&#xff1a;1.对共享数据的并发访问可能导致数据的不一致性。2.要保持数据的一致性&#xff0c;就需要一种保证并发进程正确执行顺序机制。3.解决有界缓冲区问题的共享内存方法在count上存在竞争条件。4.进程间的制约关系&#xff1a;——间接制约&#xff1a;有些资源需要…

【动态规划】拔河比赛 (ssl 1638)

拔河比赛拔河比赛拔河比赛 Description 一个学校举行拔河比赛&#xff0c;所有的人被分成了两组&#xff0c;每个人必须&#xff08;且只能够&#xff09;在其中的一组&#xff0c;要求两个组的人数相差不能超过1&#xff0c;且两个组内的所有人体重加起来尽可能地接近。 In…

特长生考试相关

水一手游记 一大早起来像个那啥一样在校训石前等&#xff08;旁边一群看猴子一样&#xff09; 然后车上点个人就去公费旅游&#xff08;半个小时车程&#xff0c;甚至没有饭吃&#xff09; 然后到那边量完体温见了一下熟人就开始了 T1高精度&#xff0c;历年最难T1还要判负数然…

Build 2018,给你带来全新的开发者体验, .NET Core 3.0带来桌面支持

Build 2018 主旨演讲的主题是 Azure 云和 AI、物联网、AR等技术&#xff0c;以及开发者相关内容的宣布。在今天的Build大会上&#xff0c;微软宣布目前已有超过7亿台设备运行Windows 10系统。去年这个数字为5亿。Office 365目前每个月有1.35亿活跃的商业用户&#xff0c;去年为…

【动态规划】大厅安排 (ssl 1212)

大厅安排大厅安排大厅安排 Description 有一个演讲大厅需要GEORGE管理&#xff0c;演讲者们事先定好了需要演讲的起始时间和中止时间。GEORGE想让演讲大厅得到最大可能的使用。我们要接受一些预定而拒绝其他的预定&#xff0c;目标自然是使演讲者使用大厅的时间最长。为方便起…

《你必须掌握的Entity Framework 6.x与Core 2.0》书籍出版

前言到目前为止写过刚好两百来篇博客&#xff0c;看过我博客的读者应该大概知道我每一篇博客都沿袭着一贯的套路&#xff0c;从前言到话题最终到总结&#xff0c;本文依然是一如既往的套路&#xff0c;但是不是介绍技术&#xff0c;也可说是介绍技术&#xff0c;不过是介绍书中…

Loj#2035-[SDOI2016]征途【斜率优化】

正题 题目链接:https://loj.ac/problem/2035 题目大意 nnn个数字分成mmm段&#xff0c;要求方差最小。 解题思路 首先方差的公式∑i1n(xi−∣x∣)2\sum_{i1}^n(x_i-|x|)^2i1∑n​(xi​−∣x∣)2 其中∣x∣|x|∣x∣是不变的&#xff0c;定义w∣x∣w|x|w∣x∣ 设fi,jf_{i,j}fi,…

可持久化线段树小结

学了可持久化线段树有一段时间了&#xff0c;一直没拿出时间来整理一下&#xff0c;刚好今天有空&#xff0c;就写一写。 可持久化的含义是对于每次修改操作都将产生一个新版本的线段树&#xff0c;并且旧版本的线段树仍然保留可以随时访问。 基于这个目的&#xff0c;我们可…

【动态规划】 数字游戏 (ssl 1653)

数字游戏 题目大意&#xff1a; 有n个数&#xff0c;分别为a[1] (序号为1),a[2] (序号为2),a[3]…a[n]&#xff0c;让你选m个数&#xff0c;每选一个数&#xff0c;就要减去已选个数(不算当前数)*b[i] (i为当前值的序号)&#xff0c;所选数的最大值(要减去相应的b) 原题 小…

.NET Core玩转机器学习

ML.NET 专门为.NET开发者提供了一套跨平台的开源的机器学习框架。ML.NET支持.NET开发者不需要过度专业的机器学习开发经验&#xff0c;就能轻松地训练自己的模型&#xff0c;并且嵌入到自己的应用中。一切尽在.NET之中。ML.NET早期是由Microsoft Research开发&#xff0c;近十年…

P2900-[USACO08MAR]Land AcquisitionG【斜率优化】

正题 题目链接:https://www.luogu.com.cn/problem/P2900 题目大意 nnn块hi∗wih_i*w_ihi​∗wi​的土地&#xff0c;购买一组土地需要max(h)∗max(w)max(h)*max(w)max(h)∗max(w)&#xff0c;求购买所有土地的最小费用。 解题思路 首先如果hhh和www都小于另一块土地显然是不需…

二元运算 FFT+分治

题目&#xff1a; 4836: [Lydsy2017年4月月赛]二元运算 Time Limit: 8 Sec Memory Limit: 128 MB Submit: 486 Solved: 162 [Submit][Status][Discuss] Description 定义二元运算 opt 满足 现在给定一个长为 n 的数列 a 和一个长为 m 的数列 b &#xff0c;接下来有 q 次询问。…

【记忆化搜索】【线性化DP】滑雪 (ssl 1202/luogu 1434/pku 1088)

滑雪滑雪滑雪 ssl 1202 luogu 1434 pku 1088 题目大意&#xff1a; 有一个N*M的矩阵&#xff0c;每个位置都有一个数&#xff0c;可以从大的数走向小的数&#xff0c;问可走的路最长是多少 原题 Michael喜欢滑雪百这并不奇怪&#xff0c; 因为滑雪的确很刺激。可是为了获…

POJ2942-Knights of the Round Table【tarjan】

正题 题目链接:http://poj.org/problem?id2942 题目大意 有nnn个骑士&#xff0c;有mmm组讨厌关系&#xff0c;要求讨厌的不能坐相邻&#xff0c;而且要求每次会有都有奇数个人&#xff0c;求有多少个骑士一组会议都不能参加。 解题思路 首先构一个补图&#xff0c;然后求有…

UVA4671 K-neighbor substrings FFT+字符串hash

题解&#xff1a; 将字符串A、B中的a和b分别以1和-1表示&#xff0c;对字符串B进行反转。 将A和B看成多项式&#xff0c;求卷积&#xff0c;这样的话从结果区间的[lenB−1,lenA)[lenB−1,lenA)中的每一个点的值valval&#xff0c;(lenB−val)/2(lenB−val)/2代表当前位置的字串…

微软Build 2018展示Visual Studio功能:跨系统云编程

5 月 8 日凌晨消息&#xff0c;微软 Build 2018 开发者大会在今天正式来开帷幕。很明显整场发布会被分为了上下两个部分&#xff0c;上半场如果说是聊一些技术实现和愿景&#xff0c;那下半场就应该说是实战说明了。跨平台云端编程了解下微软在现场展示了 Visual Studio&#x…

【DP】花店橱窗布置 (ssl 1626/luogu 1854)

花店橱窗布置花店橱窗布置花店橱窗布置 ssl 1626 luogu 1854 题目大意&#xff1a; 有n朵花和m个花瓶&#xff0c;每一朵花插在不同的花瓶里会有不同的美丽度&#xff0c;花瓶和花必须按原来的顺序摆放&#xff0c;求最大的美丽值 Description 假设你想以最美观的方式布置…

P4819-[中山市选]杀人游戏【tarjan】

正题 题目链接:https://www.luogu.com.cn/problem/P4819 题目大意 nnn个人&#xff0c;一个杀手&#xff0c;搜查一个平民可以知道他认识的人的身份&#xff0c;搜查杀手就会死&#xff0c;求最优情况下警察的最低死亡概率。 解题思路 先用tarjantarjantarjan搜出强连通&…

hdu4609 3idiots 三角形计数 FFT

直接上代码 #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> using namespace std; double pi acos(-1.0); struct complex{double re,im;complex(double r 0.0,double i 0.0):re(r),im(i…