(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦

Catalog

@

Problem:

 很多acm群里有题面PDF了,我就不赘述了。简单说一下,你有n次操作,每次操作有3种选择,1.造成A+ai点伤害;2.永久给D增加bi;3.永久给A增加ci。(每次操作前执行:A+=D)。问最后最多造成多少伤害。

Solution:

 这么明显的dp却没有想到,真实太菜了。当时想到要从后往前推,但就是卡着不知道怎么转移最优,如何平衡3种操作。赛后看到qls的状态定义,终于理解qls的意思了。菜是原罪啊。

状态表示:

\(dp[i][j][k]\)表示从后开始执行到第\(i\)步,执行了\(j\)次操作1,选择操作1的下标和为\(k\)所造成的最高伤害。

初始化:

memset(dp, -1, sizeof(dp));//必须初始化为-1,因为你要确保状态的正确性,也就是j次操作1的下标和真的是k才行。
dp[n][1][n] = cw[n].a;//因为最后一次肯定是要打伤害的

状态转移方程:

\[dp[i][j][k] = max(dp[i+1][j][k]+max(c*j, b*(k-i*j)), dp[i+1][j-1][k-i]+a);
\]

- 第一部分是第$i$次选择操作2或3,第二部分是第$i$次选择操作1。
- 如果这一次选择操作3,显然后面的$j$次伤害需要增加$c*j$。
- 同理:选择操作2,后面每次操作需要增加$b*(x-i)$点伤害,$x$是选择操作1的编号,求个和之后就是$b*(k-i*j)$了。
- 到这里,这题就解决啦。

AC_Code:

牛客上现在可以提交了,第一份代码爆内存了,另外两份都可以ac

//这份代码常数应该挺大,注意优化一下

#include<bits/stdc++.h>

using namespace std;
typedef long long LL; const int MXN = 1e5 + 5; int n, m;
LL dp[101][101][5052];
struct lp{
int a, b, c;
}cw[105]; int main(int argc, char const *argv[]) {
int tim; scanf("%d", &tim);
while(tim --) {
scanf("%d", &n);
for(int i = 1; i <= n; ++i) {
scanf("%d%d%d", &cw[i].a, &cw[i].b, &cw[i].c);
}
memset(dp, -1, sizeof(dp));
dp[n][1][n] = cw[n].a;
int tmp = n*(n+1)/2;
for(int i = n-1; i >= 1; --i) {
for(LL j = n-i+1,a=cw[i].a,b=cw[i].b,c=cw[i].c; j >= 1; --j) {
for(int k = tmp; k >= n; --k) {
if(dp[i+1][j][k] != -1) dp[i][j][k] = dp[i+1][j][k]+max(c*j, b*(k-i*j));
if(k >= i+n &&j >= 2&& dp[i+1][j-1][k-i] != -1)
dp[i][j][k] = max(dp[i][j][k], dp[i+1][j-1][k-i]+a);
}
}
}
LL ans = 0;
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= tmp; ++j) {
ans = max(ans, dp[1][i][j]);
}
}
printf("%lld\n", ans);
}
return 0;
}

滚动数组:

#include<bits/stdc++.h>
#define A cw[i].a
#define B cw[i].b
#define C cw[i].c
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int MXN = 1e5 + 7; int n, m;
struct lp{
LL a, b, c;
}cw[105];
LL dp[5051][101]; int main() {
int tim; scanf("%d", &tim);
while(tim --) {
scanf("%d", &n);
m = n*(n+1)/2;
for(int i = 0; i <= m; ++i) {
for(int j = 0; j <= n; ++j) {
dp[i][j] = -1;
}
}
for(int i = 1; i <= n; ++i) scanf("%lld%lld%lld", &A, &B, &C);
dp[n][1] = cw[n].a;
//dp[0][0] = 0;
for(int i = n-1; i >= 1; --i) {
for(int k = m; k >= n; --k) {
for(int j = n-i+1; j >= 1; --j) {
if(dp[k][j] != -1) dp[k][j] += max(j*C,(k-i*j)*B);
if(k-i>=n&&j>=2&&dp[k-i][j-1] != -1) {
dp[k][j] = max(dp[k][j], dp[k-i][j-1] + A);
}
}
}
}
LL ans = 0;
for(int i = 1; i <= m; ++i) {
for(int j = 1; j <= n; ++j) {
ans = max(ans, dp[i][j]);
}
}
printf("%lld\n", ans);
}
return 0;
}

如果你不会滚动数组,也可以这样优化空间:

#include<bits/stdc++.h>
#define A cw[i].a
#define B cw[i].b
#define C cw[i].c
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int MXN = 1e5 + 7; int n, m;
struct lp{
LL a, b, c;
}cw[105];
LL dp[5051][101][2]; int main() {
int tim; scanf("%d", &tim);
while(tim --) {
scanf("%d", &n);
m = n*(n+1)/2;
for(int i = 0; i <= m; ++i) {
for(int j = 0; j <= n; ++j) {
dp[i][j][0] = dp[i][j][1] = -1;
}
}
for(int i = 1; i <= n; ++i) scanf("%lld%lld%lld", &A, &B, &C);
dp[n][1][0] = cw[n].a;
//dp[0][0][0] = 0;
int p = 1, q = 0;
for(int i = n-1; i >= 1; --i) {
for(int k = m; k >= n; --k) {
for(int j = n-i+1; j >= 1; --j) {
if(k-i>=n&&j>=2&&dp[k-i][j-1][q] != -1) dp[k][j][p] = dp[k-i][j-1][q] + A;
if(dp[k][j][q] != -1) {
dp[k][j][p] = max(dp[k][j][p], dp[k][j][q]+max(j*C,(k-i*j)*B));
}
}
}
p = !p; q = !q;
}
LL ans = 0;
for(int i = 1; i <= m; ++i) {
for(int j = 1; j <= n; ++j) {
ans = max(ans, dp[i][j][q]);
}
}
printf("%lld\n", ans);
}
return 0;
}

Problem Description:

2018ACM-ICPC EC-Final 现场赛I题 Misunderstanding...Missing 倒着DP的更多相关文章

  1. hdu 4431 第37届ACM/ICPC 天津赛区现场赛A题 枚举

    题意:就是给了13张牌.问增加哪些牌可以胡牌.m是数字,s是条,p是筒,c是数字 胡牌有以下几种情况: 1.一个对子 +  4组 3个相同的牌或者顺子.  只有m.s.p是可以构成顺子的.东西南北这样 ...

  2. Substrings 第37届ACM/ICPC 杭州赛区现场赛C题(hdu 4455)

    http://acm.hdu.edu.cn/showproblem.php?pid=4455 https://icpcarchive.ecs.baylor.edu/index.php?option=c ...

  3. hdu 4438 第37届ACM/ICPC 天津赛区现场赛H题

    题意:Alice和Bob两个人去打猎,有两种(只)猎物老虎和狼: 杀死老虎得分x,狼得分y: 如果两个人都选择同样的猎物,则Alice得分的概率是p,则Bob得分的概率是(1-p): 但是Alice事 ...

  4. zoj 3659 第37届ACM/ICPC 长春赛区现场赛E题 (并查集)

    题意:给出一棵树,找出一个点,求出所有点到这个点的权值和最大,权值为路径上所有边权的最小值. 用神奇的并查集,把路按照权值从大到小排序,然后用类似Kruskal的方法不断的加入边. 对于要加入的一条路 ...

  5. 2013杭州现场赛B题-Rabbit Kingdom

    杭州现场赛的题.BFS+DFS #include <iostream> #include<cstdio> #include<cstring> #define inf ...

  6. Gym101981D - 2018ACM-ICPC南京现场赛D题 Country Meow

    2018ACM-ICPC南京现场赛D题-Country Meow Problem D. Country Meow Input file: standard input Output file: sta ...

  7. 2020 ICPC EC Final西安现场赛游记

    也不知道从何说起,也不知道会说些什么,最想表达的就是很累很累. 从第一天去的时候满怀希望,没什么感觉甚至还有一些兴奋.到后来一直在赶路,感觉很疲惫,热身赛的时候觉得马马虎虎,导致热身赛被咕.然后教练就 ...

  8. 2014 ACM/ICPC 鞍山赛区现场赛 D&amp;I 解题报告

    鞍山现场赛结束了呢-- 我们出的是D+E+I三道题-- 吾辈AC掉的是D和I两道,趁着还记得.先在这里写一写我写的两道水题D&I的解题报告吧^_^. D题的意思呢是说星云内有一堆排成一条直线的 ...

  9. HDU 4800/zoj 3735 Josephina and RPG 2013 长沙现场赛J题

    第一年参加现场赛,比赛的时候就A了这一道,基本全场都A的签到题竟然A不出来,结果题目重现的时候1A,好受打击 ORZ..... 题目链接:http://acm.hdu.edu.cn/showprobl ...

随机推荐

  1. LOJ 2554 「CTSC2018」青蕈领主——结论(思路)+分治FFT

    题目:https://loj.ac/problem/2554 一个“连续”的区间必然是一个排列.所有 r 不同的.len 最长的“连续”区间只有包含.相离,不会相交,不然整个是一个“连续”区间. 只有 ...

  2. 【已转移】【Java架构:基础技术】一篇文章搞掂:Java 8

    本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 一.Java的历史与演变 目的:为完全了解Java,需要理解Java的诞生原因.成型动力以及他继承的思想. 计算机语言的创新与发展 ...

  3. 微信公众号的SpringBoot+Quartz的定时任务Demo

    SpringBoot整合quartz并不难,难在普通类实现了Job接口后等于实例化交给quartz,不受Spring管理,则service层等等其他依赖的注入将无法注入,这也是难点之一. 解决方法: ...

  4. sparql学习sparql示例、dbpedia在线验证

    sparql学习sparql示例.dbpedia在线验证 导言 作为sparql群的群主,自己也不太懂sparql,竟然意外接到了一份作业.好久没有接活了.主要就是复习了一下各个语言怎么写.记录一下, ...

  5. How do I force my .NET application to run as administrator?

    How do I force my .NET application to run as administrator? You'll want to modify the manifest that ...

  6. Mac Office2016 安装及破解

    一.安装包下载地址 http://officecdn.microsoft.com/sg/C1297A47-86C4-4C1F-97FA-950631F94777/OfficeMac/Microsoft ...

  7. 用processing生成屏保程序

    想法 利用随机数控制圆圈的大小.位置以及颜色,可以产生随机的美感. 让小球动起来,并且在屏幕边界处产生反弹效果. 代码 1: float circle_x = (float) 0.0; 2: floa ...

  8. html 局部打印

    首先有个调用的方法.printView(). function printView() { bdhtml = window.document.body.innerHTML;//获取当前页的html代码 ...

  9. VS2008中所有快捷键

    转载自:http://itfocus.diandian.com/post/2011-09-16/5091994 微软开发环境的可视化界面做的很全面,几乎所有的操作都可以通过可视化界面完成,但是你是否在 ...

  10. mysql的时间存储格式

    虽然mysql提供了datatime和timestamp两种存储时间的格式,但是如果设计较多计算,应存INT(11)类型.