linux下acm串口 原始模式,2018ACM-ICPC EC-Final题解 现场赛I题 倒着DP Misunderstanding...Missing...

"本文介绍了如何使用动态规划解决一个ACM竞赛题目,涉及状态转移方程的建立,通过(dp[i][j][k])表示从后向前操作,以找到在n次操作中选择1、2、3种操作以达到最大伤害的方法。关键在于理解状态定义和正确转移策略。"
摘要由CSDN通过智能技术生成

目录

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

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));//初始化为0始终过不了第三样例,因为你要确保状态的正确性,也就是j次操作1的下标和真的是k才行。

dp[n][1][n] = cw[n].a; dp[n][0][0] = 0;

状态转移方程:

\[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:

#include

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;

dp[n][0][0] = 0;

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 >= 0; --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 && 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;

}

Problem Description:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值