P1174 打砖块

news/2025/2/25 20:46:30/文章来源:https://www.cnblogs.com/zzzsacmblog/p/18737213

链接

https://www.luogu.com.cn/problem/P1174

思路

刚开始的思路:设置dp[i][j]:前i列使用了j颗子弹,那么递推dpi,j=max(dpi,j,dpi-1,k+maxj-k),然后统计在第i列使用了j-k颗子弹会多出来多少颗,把这些遍历加到前面,见代码。喜提70pts。但是搞不懂哪里错了。
看了评论区的dp:

70pts代码

#include<bits/stdc++.h>
using namespace std;#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define int long longusing namespace std;const int N = 1e3 + 10;
int n, m, k;
int mp[N][N];
int has[N][N];
int dp[N][N];
//dp[i][j]:前i列用了j发子弹,然后利用前缀和
void init()
{for (int j = 1; j <= m; j++)for (int i = n; i > 0; i--)mp[i][j] += mp[i + 1][j],has[i][j] += has[i + 1][j];
}signed main()
{IOS;cin >> n >> m >> k; for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++){cin >> mp[i][j];char x; cin >> x;  has[i][j] = (x == 'Y')?1:0;}init();for (int j = 1; j <= k; j++){int now = min(j, n) ;int cal = min(has[n - now + 1][1] + now, n);dp[1][j] = mp[n - cal + 1][1];}for (int i = 2; i <= m; i++)for (int j = 1; j <= k; j++){for (int l = 0; l <= j; l++){int now = min(j - l, n);int add = has[n - now + 1][i];for (int ik = 0; ik <= add; ik++){int cal2= min(add - ik + now, n);dp[i][j] = max(dp[i][j], dp[i - 1][min(l + ik,k)] + mp[n - cal2 + 1][i]);}}}cout << dp[m][k];return 0;
}

AC代码

#include<bits/stdc++.h>
using namespace std;#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define int long longusing namespace std;int n, m, k;
bool c[205][205];
char x;
int a[205][205];
int dy[205][405], dn[205][405], dpn[205][405], dpy[205][405];
signed main() {IOS;cin >> n >> m >> k;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {cin >> a[i][j] >> x;if (x == 'Y') c[i][j] = 1;}}for (int j = 1; j <= m; j++) {int tot = 0;for (int i = n; i >= 1; i--) {if (c[i][j] == 1) dy[j][tot] += a[i][j];else {tot++;dn[j][tot] = dy[j][tot - 1] + a[i][j];dy[j][tot] = dn[j][tot];}}}for (int i = 1; i <= m; i++) {for (int j = 0; j <= k; j++) {for (int l = 0; l <= min(j, n); l++) {dpy[i][j] = max(dpy[i][j], dpy[i - 1][j - l] + dy[i][l]);if (l != 0) dpn[i][j] = max(dpn[i][j], dpy[i - 1][j - l] + dn[i][l]);if (j != l) dpn[i][j] = max(dpn[i][j], dpn[i - 1][j - l] + dy[i][l]);//如果不是所有的子弹都投到j列}}}cout<<dpn[m][k];return 0;
}

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

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

相关文章

redis - [06] redis-benchmark性能测试

题记部分 001 || 参数含义 002 || 测试100个并发,100000个请求 启动redis-server redis-server /etc/redis.conf 进行性能测试 redis-benchmark -h localhost -p 6379 -c 100 -n 100000

百万架构师第四十三课:Nginx:Nginx 应用实战|JavaGuide

百万架构师系列文章阅读体验感更佳 原文链接:https://javaguide.net 公众号:不止极客 课程目标:Nginx 反向代理功能配置 Nginx 负载均衡实战 Nginx 动静分离配置 Nginx 配置文件分析 Nginx 多进程模型原理 Nginx 高可用集群实战反向代理​ 我们把请求发送到 proxy (代理服务…

大三下每日打卡003

今天配置了python的虚拟环境anaconda想尝试一下yolov8来实现识别

需求评审

需求评审是产品经理日常会议的形式之一,也是一个“公开处刑”的时刻。这篇文章,我们看看作者分享的如何做好一次需求评审的经验,供大家参考。前段时间有小伙伴留言,想聊一下关于需求评审面向不同角色如何处理,以及产品不同生命周期产品工作上有什么区别。我结合自己工作经…

牛客题解 | 对称的二叉树_1

牛客题库题解题目 题目链接 题目的主要信息:判断一棵二叉树是否是镜像,即判断二叉树是否是轴对称图形轴对称:非轴对称:举一反三: 学习完本题的思路你可以解决如下题目: BM28. 二叉树的最大深度 BM29. 二叉树中和为某一值的路径(一) BM32. 合并二叉树 BM33. 二叉树的镜像…

牛客题解 | 字符串变形

牛客题库题解题目 题目链接 题目主要信息:将字符串大小写反转 将整个字符串的所有单词位置反转举一反三: 学会了本题的思路,你将可以解决类似的字符串问题: BM84. 最长公共前缀 BM85. 验证IP地址 方法一:双逆转(推荐使用) 思路: 将单词位置的反转,那肯定前后都是逆序,…

牛客题解 | 在二叉树中找到两个节点的最近公共祖先

牛客题库题解题目 题目链接 题目的主要信息:给定一棵二叉树以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点 二叉树非空,且每个节点值均不同举一反三: 学习完本题的思路你可以解决如下题目: BM29. 二叉树中和为某一值的路径(一) BM37. …

牛客题解 | 反转链表_1

牛客题库题解题目 题目链接 题目的主要信息:给定一个长度为\(n\)的链表,反转该链表,输出表头举一反三: 学习完本题的思路你可以解决如下题目: JZ6. 从尾到头打印链表 方法一:迭代(推荐使用) 思路: 将链表反转,就是将每个表元的指针从向后变成向前,那我们可以遍历原始…

牛客题解 | 判断链表中是否有环

牛客题库题解题目 题目链接 题目主要信息:给定一个链表的头节点,判断这个链表是否有环 环形链表如下所示:举一反三: 学习完本题的思路你可以解决如下题目: BM4.合并有序链表 BM5.合并k个已排序的链表 BM7.链表中环的入口节点 BM8.链表中倒数最后k个节点 BM9.删除链表的倒数…

牛客题解 | 剪绳子

牛客题库题解题目 题目链接 题目的主要信息:把一根长度为\(n\)的绳子分成\(m\)段,每段长度都是整数 求每段长度乘积的最大值举一反三: 学习完本题的思路你可以解决如下题目: JZ83. 剪绳子(进阶版) JZ71. 跳台阶扩展问题 JZ42. 连续子数组的最大和 方法一:动态规划(推荐…

牛客题解 | 剪绳子(进阶版)

牛客题库题解题目 题目链接 题目的主要信息:把一根长度为\(n\)的绳子分成\(m\)段,每段长度都是整数 求每段长度乘积的最大值 由于答案过大,请对 998244353 取模举一反三: 学习完本题的思路你可以解决如下题目: JZ14. 剪绳子 方法:快速幂+快速乘法(推荐使用) 知识点1:贪心…

牛客题解 | 判断一个链表是否为回文结构

牛客题库题解题目 题目链接 题目的主要信息:给定一个链表的头节点,判读该链表是否为回文结构 回文结构即正序遍历与逆序遍历结果都是一样的,类似123321 空链表默认为回文结构举一反三: 学习完本题的思路你可以解决如下题目: BM4.合并有序链表 BM5.合并k个已排序的链表 BM6…