P1833 樱花(有疑惑)

1|0P1833 樱花(有疑惑)

最逆天的一集

一开始打算用最初的二维数组dp做,一直80tps,T一个点,WA一个点。

#include <iostream> #include <cstdio> #include <cstring> using namespace std; string a, b; int T, N; int t[10010], c[10010], p[10010]; int dp[10010][1010]; void getTime() { int ha = 0, hb = 0, ma = 0, mb = 0; bool is_ha = true, is_hb = true; cin >> a >> b; for (int i = 0; i < a.length(); i++) { if (a[i] != ':' && is_ha) { ha = ha * 10 + a[i] - '0'; continue; } is_ha = false; if (a[i] != ':' && !is_ha) { ma = ma * 10 + a[i] - '0'; } } for (int i = 0; i < b.length(); i++) { if (b[i] != ':' && is_hb) { hb = hb * 10 + b[i] - '0'; continue; } is_hb = false; if (b[i] != ':' && !is_hb) { mb = mb * 10 + b[i] - '0'; } } if (mb < ma) { T = mb + 60 - ma + (hb - ha - 1) * 60; } else { T = mb - ma + (hb - ha) * 60; } } int main() { getTime(); cin >> N; for (int i = 1; i <= N; i++) { cin >> t[i] >> c[i] >> p[i]; } for (int i = 1; i <= N; i++) { for (int j = 1; j <= T; j++) { if (p[i] != 0) { for (int k = 1; k * t[i] <= T && k <= p[i]; k++) { if (k * t[i] <= j) dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - k * t[i]] + k * c[i]); else dp[i][j] = dp[i - 1][j]; } } else { for (int k = 0; k * t[i] <= j; k++) { dp[i][j] = max(dp[i][j], dp[i - 1][j - k * t[i]] + k * c[i]); } } } } cout << dp[N][T]; return 0; }

改不出来一点,第二天早上起来索性直接把第一维删掉,改成优化版dp,然后就ac了??

不明白为什么

#include <iostream> #include <cstdio> #include <cstring> using namespace std; string a, b; int T, N; int t[10010], c[10010], p[10010]; int dp[1010]; void getTime() { int ha = 0, hb = 0, ma = 0, mb = 0; bool is_ha = true, is_hb = true; cin >> a >> b; for (int i = 0; i < a.length(); i++) { if (a[i] != ':' && is_ha) { ha = ha * 10 + a[i] - '0'; continue; } is_ha = false; if (a[i] != ':' && !is_ha) { ma = ma * 10 + a[i] - '0'; } } for (int i = 0; i < b.length(); i++) { if (b[i] != ':' && is_hb) { hb = hb * 10 + b[i] - '0'; continue; } is_hb = false; if (b[i] != ':' && !is_hb) { mb = mb * 10 + b[i] - '0'; } } if (mb < ma) { T = mb + 60 - ma + (hb - ha - 1) * 60; } else { T = mb - ma + (hb - ha) * 60; } } int main() { getTime(); cin >> N; for (int i = 1; i <= N; i++) { cin >> t[i] >> c[i] >> p[i]; } for (int i = 1; i <= N; i++) { for (int j = T; j >= 1; j--) { if (p[i] != 0) { for (int k = 1; k * t[i] <= T && k <= p[i]; k++) { if (k * t[i] <= j) dp[j] = max(dp[j], dp[j - k * t[i]] + k * c[i]); } } else { for (int k = 0; k * t[i] <= j; k++) { dp[j] = max(dp[j], dp[j - k * t[i]] + k * c[i]); } } } } cout << dp[T]; return 0; }

__EOF__

本文作者Kdlyh
本文链接https://www.cnblogs.com/kdlyh/p/17807016.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   加固文明幻景  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示