Pangu and Stones (hihocoder 1636)

2024-03-02 08:48
文章标签 hihocoder pangu stones 1636

本文主要是介绍Pangu and Stones (hihocoder 1636),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 题目链接:

题目链接:

https://hihocoder.com/problemset/problem/1636?sid=1401840

题意:就是合并石子的问题,只不过这次是有区间限制,只能合并[L,R]这之这么多堆的石子

有了这个限制感觉就没那么好理解dp方程了,因为还要考虑合并成了几堆,所以就还要开一维状态来记录现在是合并成了多少堆,于是dp[i][j][p]表示[i,j]这段区间合并成了p堆的代价,那么就有一个转移方程:
d p [ i ] [ j ] [ p ] = m i n ( d p [ i ] [ j ] [ p ] , d p [ i ] [ k ] [ 1 ] + d p [ k + 1 ] [ j ] [ p − 1 ] + c o s t ) dp[i][j][p]=min(dp[i][j][p],dp[i][k][1]+dp[k+1][j][p-1]+cost) dp[i][j][p]=min(dp[i][j][p],dp[i][k][1]+dp[k+1][j][p1]+cost)
就是说枚举断点k,然后前面这一坨是合并成1堆,后面这一坨合并成p-1堆,那么总共就是p堆。
但是我觉得还应该多加一个,前面分成p-1堆,后面是一堆的这种:
d p [ i ] [ j ] [ p ] = m i n ( d p [ i ] [ j ] [ p ] , d p [ i ] [ k ] [ p − 1 ] + d p [ k + 1 ] [ j ] [ 1 ] + c o s t ) dp[i][j][p]=min(dp[i][j][p],dp[i][k][p-1]+dp[k+1][j][1]+cost) dp[i][j][p]=min(dp[i][j][p],dp[i][k][p1]+dp[k+1][j][1]+cost)

但是好像只写一个就行,我也不知道为什么,不知道是数据太水了还是理论上就是对的

感觉要是我写的话我还要枚举前面一段分成两堆,后面一段分成p-2堆,然后前面一段分成3堆,后面一段分成p-3堆。。。。。
感觉别人写得真的是好巧妙啊~

#include"bits/stdc++.h"
using namespace std;
typedef long long LL;
const int maxn=100+5;
const int inf=0x3f3f3f3f;
int dp[maxn][maxn][maxn];//dp[i][j][p]表示[i,j]区间内分成p堆
int a[maxn],sum[maxn];
int main()
{int N,L,R;while(cin>>N>>L>>R){memset(dp,0x3f,sizeof dp);for(int i=1; i<=N; i++)cin>>a[i],sum[i]=sum[i-1]+a[i],dp[i][i][1]=0;for(int len=1; len<N; len++)for(int i=1; i+len<=N; i++){int j=i+len;for(int p=2; p<=min(len+1,R); p++) //枚举p堆,最多分成这段长度这么多堆,然后再与给的上线取min {//剩下的j-k+1这一段要够分p堆才行,所以p<=j-k+1 for(int k=i; k<j&&p<=j-k+1; k++)dp[i][j][p]=min(dp[i][j][p],dp[i][k][1]+dp[k+1][j][p-1]);//考虑合成p堆 if(p>=L)dp[i][j][1]=min(dp[i][j][1],dp[i][j][p]+sum[j]-sum[i-1]);//考虑合成1堆 }}if(dp[1][N][1]==inf)cout<<0<<endl;else cout<<dp[1][N][1]<<endl;}
}

这篇关于Pangu and Stones (hihocoder 1636)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/765554

相关文章

[Gym103960B] Fun with Stones

并不是多困难或者有趣的题,写sol仅仅是因为觉得好笑()。 题目大意 三堆石子 Nim 游戏,第 i i i 堆石子数量在 [ l i , r i ] [l_i , r_i] [li​,ri​] 中随机,求先手必胜的概率,对 1 0 9 + 7 10^9+7 109+7 取模。 l i , r i ≤ 1 0 9 l_i , r_i≤10^9 li​,ri​≤109。 题解 说人

#1121 : 二分图一•二分图判定 (HIHOCoder +二分图的判定)

#1121 : 二分图一•二分图判定 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我是小Hi和小Ho的小伙伴Nettle,从这个星期开始由我来完成我们的Weekly。 新年回家,又到了一年一度大龄剩男剩女的相亲时间。Nettle去姑姑家玩的时候看到了一张姑姑写的相亲情况表,上面都是姑姑介绍相亲的剩男剩女们。每行有2个名

hihoCoder #1174:拓扑排序·一

【题目链接】:click here~~ 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 由于今天上课的老师讲的特别无聊,小Hi和小Ho偷偷地聊了起来。 小Ho:小Hi,你这学期有选什么课么? 小Hi:挺多的,比如XXX1,XXX2还有XXX3。本来想选YYY2的,但是好像没有先选过YYY1,不能选YYY2。 小Ho:先修课程真是个麻烦的东西

HDU 1896 Stones (Priority_queue)

【题目链接】:click here~~ 【题目大意】: 就是说在一条直线道路上有n个石头,往前走,遇到一个数一个,如果遇到的是第奇数个那就把这个石头往前扔距离dis[i], 如果是第偶数个,就放置不管。 问人走到最后一个石头的位置距原地多远(遇到的最后一个石头距离出发点的位置是多少)。 【思路】模拟即可,遇到第奇数个石头,就将其加上dis[i],放回到优先队列(priority_queue)

【hihocoder #1506 : 投掷硬币】递推

【链接】:hihocoder #1506 : 投掷硬币 【题目】: 1506 : 投掷硬币 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi有一枚神奇的硬币。已知第i次投掷这枚硬币时,正面向上的概率是Pi。 现在小Hi想知道如果总共投掷N次,其中恰好M次正面向上的概率是多少。 输入 第一行包含两个整数N和M。 第二行包含N个实数P1, P

HihoCoder上网络流算法题目建模总结

经过了几天的学习和做题,我利用刘汝佳书上的网络流算法模板完成了HihoCoder上的几个网络流算法,HihoCoder可能还会继续更新网络流算法,所以我也会接着总结。 这个主要是对网络流算法的建模做分析和理解,不具体分析网络流算法,网络流算法会单独总结。 网络流一·Ford-Fulkerson算法 题目连接 本题没有建模,就是标准的网络最大流求解,将图建完后直接应用最大流算法即可解决。但在

hihocoder--数字三角形

问题描述 小Hi和小Ho在经历了螃蟹先生的任务之后被奖励了一次出国旅游的机会,于是他们来到了大洋彼岸的美国。美国人民的生活非常有意思,经常会有形形色色、奇奇怪怪的活动举办,这不,小Hi和小Ho刚刚下飞机,就赶上了当地的迷宫节活动。迷宫节里展览出来的迷宫都特别的有意思,但是小Ho却相中了一个其实并不怎么像迷宫的迷宫——因为这个迷宫的奖励非常丰富~ 于是小Ho找到了小Hi,让小Hi帮助他获取尽可能

hihoCoder hiho一下 第五十一周 欧拉路·三

题目1 : 欧拉路·三 时间限制: 10000ms 单点时限: 1000ms 内存限制: 256MB 描述 小Hi和小Ho破解了一道又一道难题,终于来到了最后一关。只要打开眼前的宝箱就可以通关这个游戏了。 宝箱被一种奇怪的机关锁住: 这个机关是一个圆环,一共有2^N个区域,每个区域都可以改变颜色,在黑白两种颜色之间切换。 小Ho控制主角在周围探索了一下,果然

hihocoder #1175 : 拓扑排序·二

#1175 : 拓扑排序·二 时间限制: 10000ms 单点时限: 1000ms 内存限制: 256MB 描述 小Hi和小Ho所在学校的校园网被黑客入侵并投放了病毒。这事在校内BBS上立刻引起了大家的讨论,当然小Hi和小Ho也参与到了其中。从大家各自了解的情况中,小Hi和小Ho整理得到了以下的信息: 校园网主干是由N个节点(编号1..N)组成,这些节点之间有一些

hihocoder 1364 : 奖券兑换(多重背包)

#1364 : 奖券兑换 时间限制: 20000ms 单点时限: 1000ms 内存限制: 256MB 描述 小Hi在游乐园中获得了M张奖券,这些奖券可以用来兑换奖品。 可供兑换的奖品一共有N件。第i件奖品需要Wi张奖券才能兑换到,其价值是Pi。   小Hi使用不超过M张奖券所能兑换到的最大奖品总价值是多少? 输入 第一行两个整数N,M。   接下来N行,每行