[SCU 4516] Mingo's Game (斜率DP)

2024-06-21 19:58
文章标签 scu 4516 mingo game dp 斜率

本文主要是介绍[SCU 4516] Mingo's Game (斜率DP),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SCU - 4516

有 N个关卡,可以分为 K块,每个关卡都有个权值 ti
每次选择最早没有通关的关卡块,设这个关卡包含了 [i,j] 的游戏
选到最早没有通关的关卡是k, 选到 k的概率是 P=tkjx=ix
选到一个关卡一定能通关,花费一小时
求合理分块的情况下,通关所有关卡块的期望时间最小是多少


原题是 CodeForces - 643C Levels and Regions ,做法是斜率优化DP。
概率公式的推导过程一脸懵逼,反正我看了题解才会做的 0.0
http://m.blog.csdn.net/article/details?id=51346853

#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std;
typedef pair<int,int> Pii;
typedef long long LL;
typedef unsigned long long ULL;
typedef double DBL;
typedef long double LDBL;
#define MST(a,b) memset(a,b,sizeof(a))
#define CLR(a) MST(a,0)
#define Sqr(a) (a*a)const int maxn=5e5+10;
int N,K;
DBL psum[maxn],qsum[maxn],E[maxn];
DBL dp[60][maxn];
int que[maxn*2];DBL Up(int,int,int);
DBL Down(int,int);int main()
{#ifdef LOCALfreopen("in.txt", "r", stdin);
//  freopen("out.txt", "w", stdout);#endifint T;scanf("%d", &T);for(int ck=1; ck<=T; ck++){scanf("%d%d", &N, &K);for(int i=1; i<=N; i++){DBL x;scanf("%lf", &x);psum[i]=psum[i-1]+x;qsum[i]=qsum[i-1]+1/x;E[i]=E[i-1]+psum[i]/x;dp[1][i]=E[i];}for(int k=2; k<=K; k++){int head=0,tail=1;que[0]=1;CLR(dp[k]);for(int i=1; i<=N; i++){while(head+1<tail && Up(k-1, que[head], que[head+1]) <= qsum[i]*Down(que[head], que[head+1]))head++;int j=que[head];dp[k][i]=dp[k-1][j-1]+E[i]-E[j-1]-psum[j-1]*(qsum[i]-qsum[j-1]);while(head+1<tail &&Up(k-1, que[tail-1], i)*Down(que[tail-2], que[tail-1]) <= Up(k-1, que[tail-2], que[tail-1])*Down(que[tail-1], i))tail--;que[tail++]=i;}}printf("%.4f\n", dp[K][N]);}return 0;
}DBL Up(int flr, int k, int j)
{return dp[flr][j-1]-E[j-1]+psum[j-1]*qsum[j-1]-(dp[flr][k-1]-E[k-1]+psum[k-1]*qsum[k-1]);
}DBL Down(int k, int j)
{return psum[j-1]-psum[k-1];
}

这篇关于[SCU 4516] Mingo's Game (斜率DP)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

上海邀请赛 A题目 HDU 5236(dp)

先求出没有ctrl+s的时候构造长度为i的期望f[i] 。然后枚举保存的次数,求出最小即可。 #include<cstdio>#include<cstdio>#include<cmath>#include<queue>#include<stack>#include<string>#include<cstring>#include<iostream>#include<map>

poj 3160 Father Christmas flymouse 强连通+dp

首先我们可以确定的是,对于val值小于0的节点都变成0.   假设一个集合内2个房间都能任意到达,那么我就可以吧集合内的所有点的价值都取到,并且可以达到任一点。实际上集合内的每个点是相同的,这样的集合就是一个强连通分量。 那么我们就可以用tarjin算法进行强连通缩点, 最后形成一个dag的图。在dag的图上面进行dp。可以先用拓扑排序后dp。或者建反响边记忆化搜索 。 VIEW

秋招突击——6/22——复习{区间DP——加分二叉树,背包问题——买书}——新作{移除元素、实现strStr()}

文章目录 引言复习区间DP——加分二叉树个人实现 背包问题——买书个人实现参考实现 新作移除元素个人实现参考思路 找出字符串中第一个匹配项的下标个人实现参考实现 总结 引言 今天做了一个噩梦,然后流了一身汗,然后没起来,九点多才起床背书。十点钟才开始把昨天那道题题目过一遍,然后十一点才开始复习题目,为了不耽误下午的时间,所以这里的就单纯做已经做过的题目,主打一个有量,不在学

动态规划DP--斐波那契数、爬楼梯、使用最小花费爬楼梯等示例代码

动态规划DP 文章目录 动态规划DP509. 斐波那契数70. 爬楼梯746. 使用最小花费爬楼梯62. 不同路径63. 不同路径II343.整数拆分 509. 斐波那契数 509. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) =

博弈论+递推+调和级数枚举,CF 1033C - Permutation Game

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1033C - Permutation Game 二、解题报告 1、思路分析 我们考虑一个位置符合什么条件可以必胜? 如果可以跳到一个必败的位置 考虑最大的格子一定是必败 而每个格子只能跳到比自己大的格子 于是我们就可以倒序处理状态 对于每个格子枚举比自己大

状态压缩DP——AcWing 291. 蒙德里安的梦想

状态压缩DP 定义 状态压缩DP是一种利用二进制数来表示状态的动态规划算法。它通过将状态压缩成一个整数,从而减少状态数量,提高算法效率。 运用情况 状态压缩DP通常用于解决具有状态转移和最优解性质的问题,例如组合优化、图论、游戏等问题。它的基本思想是将问题的状态表示为一个二进制数,其中每一位表示一个元素或一个状态。通过对二进制数的位运算,可以方便地进行状态转移和最优解的计算。 注意事项

【游泳game】

编写一个游泳游戏涉及到多个方面,包括游戏设计、图形渲染、物理模拟、音效和用户界面。以下是一个简化的游泳游戏编写流程,假设我们使用Unity游戏引擎进行开发: 1. 游戏设计 游戏目标:确定游戏的基本规则,例如计时赛、竞速赛或技巧挑战。角色和场景:设计玩家角色和游泳池场景,包括赛道、观众、记分牌等。游戏玩法:设计控制方式,如触摸屏、键盘或体感控制器。 2. 准备开发环境 安装Unity编辑器

293. Flip Game

题目大意:给一串字符++–….,要依次把所有两个连续++翻转成–,求所有可能的输出. 解题思路:一次遍历,遇到两个连续的++就翻转,输出.同时保证不影响原串,用一个tmp来操作. 注意:这里有一个奇怪的bug,若不先求出s的长度n,而是在for循环中设终止条件为 s.length()-1,则遇到空串(长度为0)会报错 代码: class Solution {public:vector<s

算法基础精选题单 动态规划(dp)(区间dp)(个人题解)

目录 前言: 正文:   题单:【237题】算法基础精选题单_ACM竞赛_ACM/CSP/ICPC/CCPC/比赛经验/题解/资讯_牛客竞赛OJ_牛客网 (nowcoder.com) NC50493 石子合并: NC50500 凸多边形的划分: NC235246 田忌赛马: NC13230 合并回文子串: NC16645 [NOIP2007]矩阵取数游戏: NC207781 迁徙

【快乐星球game】

编写游戏程序代码是一个复杂的过程,涉及到游戏设计、编程、图形设计、音效制作等多个方面。以下是一个非常简化的示例,用于展示如何开始编写一个基本的游戏程序。我们将使用Python语言和一个名为Pygame的库来创建一个简单的游戏。 首先,确保你已经安装了Python和Pygame。你可以通过运行以下命令来安装Pygame: pip install pygame 然后,我们可以编写一个简单的游戏程