当前位置: 首页 > news >正文

AtCoder Educational DP Contest 刷题记录Ⅰ

刷题背景1

我有女朋友了,在酒吧认识的。说起来很梦幻 感觉是双向一见倾心 一眼在人海中看见彼此的。真的很爱,当时情况很特殊不能长话短说 因为全是细节,要不这样吧 今天肯德基疯狂星期四 给我点个套餐我说出全部过程。

刷题背景2

为什么我要学信竞
我认为:
原因其一,信竞学术氛围严谨,勤勤恳恳,能打好知识体系的地基;
原因其二,信竞大佬众多,能引发选手疯狂的思考;
原因其三,信竞很关心选手,务实地在生活学习上帮助我处理问题、解答疑惑。
总结下来一句话:垦得基,疯狂兴起思,为我务实。

A - Frog 1

原题链接:A - Frog 1

分析

橙题调不过,我是**/(ㄒoㄒ)/~~

注意边界!!!

状态

我们设dp_i表示跳到第i个台阶的最小代价。

转移

dp_i=min(dp_{i-1}+|h_i-h_{i-1}|, dp_{i-2}+|h_i-h_{i-2}|)

答案

dp_n

正解

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 100005;
int dp[N], h[N], n;
signed main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;for (int i = 1; i <= n; i++){cin >> h[i];dp[i] = 1e18;}dp[1] = 0;for (int i = 2; i <= n; i++){dp[i] = min(dp[i], dp[i - 1] + abs(h[i] - h[i - 1]));if (i >= 3){dp[i] = min(dp[i], dp[i - 2] + abs(h[i] - h[i - 2]));}}cout << dp[n];return 0;
}

B - Frog 2

原题链接:B - Frog 2

分析

秒了!同样卡一下边界,十分轻松!!!

状态

我们设dp_i表示跳到第i个台阶的最小代价。

转移

dp_i=min_{j=i-k}^{i} dp_{j} + |h_j-h_i|

答案

dp_n

正解

#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int dp[N], h[N], n, k;
signed main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n >> k;for (int i = 1; i <= n; i++){cin >> h[i];dp[i] = 0x3f3f3f3f;}dp[1] = 0;if (k > n){for (int i = 1; i <= n; i++){for (int j = 1; j <= i; j++){dp[i] = min(dp[i], dp[j] + abs(h[i] - h[j]));}}cout << dp[n];return 0;}for (int i = 1; i <= k; i++){for (int j = 1; j <= i; j++){dp[i] = min(dp[i], dp[j] + abs(h[i] - h[j]));}}for (int i = k + 1; i <= n; i++){for (int j = i - k; j <= i; j++){dp[i] = min(dp[i], dp[j] + abs(h[i] - h[j]));}}cout << dp[n];return 0;
}

C - Vacation

原题链接:C - Vacation

分析

又秒了!!!

状态

dp_{i,0/1/2}表示第i天,强制Swim in the sea/Catch bugs in the mountains/Do homework at home的最大快乐值

转移

dp_{i,j}=max_{j=0/1/2,i\neq j} dp_{i-1,j}+inp_{i,j}

答案

max(dp_{n,0},dp_{n,1},dp_{n,2})

正解

#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int dp[N][3];
int a[N], b[N], c[N];
int n;
int main(){cin >> n;for (int i = 1; i <= n; i++){dp[i][0] = dp[i][1] = dp[i][2] = 0xc0c0c0c0c0;cin >> a[i] >> b[i] >> c[i];}dp[1][0] = a[1];dp[1][1] = b[1];dp[1][2] = c[1];for (int i = 2; i <= n; i++){dp[i][0] = max(dp[i - 1][1], dp[i - 1][2]) + a[i];dp[i][1] = max(dp[i - 1][0], dp[i - 1][2]) + b[i];dp[i][2] = max(dp[i - 1][0], dp[i - 1][1]) + c[i];}cout << max({dp[n][0], dp[n][1], dp[n][2]});
}

D - Knapsack 1

原题链接:D - Knapsack 1

分析

标准的背包板子。

啥,过不了/(ㄒoㄒ)/~~

状态

dp_i表示最多使用i的体积可以获得的最大价值

转移

dp_i=max_{j=V}^{w[i]}dp_{j-w[i]}+v[i]

答案

dp_V

正解

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 105, W = 100005;
int n, V;
int w[N], v[N];
int dp[W];
signed main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n >> V;for (int i = 1; i <= n; i++){cin >> w[i] >> v[i];}for (int i = 1; i <= n; i++){for (int j = V; j >= w[i]; j--){dp[j] = max(dp[j], dp[j - w[i]] + v[i]);}}cout << dp[V];
} 

E - Knapsack 2

原题链接:E - Knapsack 2

分析

居然是维度转化吗?AT果然超模。

乍一看似乎和上题没区别,但是开dp数组是就应该意识到问题了,W太大了,会MLE+TLE。

那么,考虑维度转化。

状态

dp_i表示价值为i的最小体积

转移

dp_i=max_{j=sum}^{v[i]}dp_{sum-v[i]}+w[i]

答案

满足dp_i\leq V的最大的i

正解

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 105, M = 100005;
int n, W, w[N], v[N], sum;
int dp[M];
signed main(){cin >> n >> W;for (int i = 1; i <= n; i++){cin >> w[i] >> v[i];sum += v[i];}memset(dp, 0x3f, sizeof(dp));dp[0] = 0;for (int i = 1; i <= n; i++){for (int j = sum; j >= v[i]; j--){dp[j] = min(dp[j], dp[j - v[i]] + w[i]);}}int ans = 0;for (int i = 1; i <= sum; i++){if (dp[i] <= W){ans = i;}}cout << ans;
}

F - LCS

原题链接:F - LCS

分析

难点不在于长度 ,而在于保留答案,就需要被LCS板子了。

正解

#include <bits/stdc++.h>
using namespace std;
const int N = 3005;
int dp[N][N];
string s1, s2;
char ans[N];
int main(){cin >> s1 >> s2;int n = s1.length();int m = s2.length();s1 = " " + s1;s2 = " " + s2; for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);if (s1[i] == s2[j]){dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + 1);}}}int i = n, j = m;while (dp[i][j] > 0){if (s1[i] == s2[j]){ans[dp[i][j]] = s1[i];i--;j--;}else{if (dp[i][j] == dp[i - 1][j])i--;elsej--;}}cout << ans + 1;
} 

G - Longest Path

原题链接:G - Longest Path

分析

小心出度为0即可。

正解

#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int n, m, x, y;
bool vis[N];
int dp[N];
vector<int> e[N];
void dfs(int u) {if (vis[u]) return;vis[u] = true;if (e[u].empty()) {dp[u] = 0;return;}dp[u] = -1;for (auto v : e[u]) {dfs(v);dp[u] = max(dp[u], dp[v] + 1);}
}
int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n >> m;for (int i = 1; i <= m; i++){cin >> x >> y;e[x].push_back(y);}int ans = 0;for (int i = 1; i <= n; i++){dfs(i);ans = max(ans, dp[i]);}cout << ans;return 0;
}
http://www.dtcms.com/a/577155.html

相关文章:

  • WPF CalcBinding简化判断逻辑
  • HarmonyOS NFC应用开发:构建分布式近场通信解决方案
  • Robinhood的再进化:从零佣金交易到链上金融超级应用
  • Rust开发实战之简单游戏开发(piston游戏引擎)
  • MK9019 Buck降压电路设计笔记(光伏发电应用优化版 - UVLO 7V设置)
  • 5118网站的功能郑州网站优化公司排名
  • MQTT协议之QoS0(<=1)、QoS1(>=1)、QoS2(=1)详解
  • Dify使用02-Dify集成Ollama
  • [免费]基于Python的Flask酒店客房管理系统【论文+源码+SQL脚本】
  • LeetCode 219.存在重复元素2
  • 【CS224N】《深度学习自然语言处理》完整版笔记
  • 广东企业网站建设推荐网站做收录
  • XC7Z020-1CLG484I Xilinx AMD FPGA Zynq-7000 SoC
  • 论文分享 | BARD-GS:基于高斯泼溅的模糊感知动态场景重建
  • FPGA—ZYNQ学习spi(六)
  • 多智能体医疗会诊系统
  • ETCD 压力测试脚本
  • kali的下载和安装【ISO安装】
  • 从标签到数据流:BarTender让“可追溯”更简单
  • 零基础学AI大模型之Embedding与LLM大模型对比全解析
  • 7.游戏逆向-pxxx-TUObjectArray分析
  • web214-web220
  • 通州北苑网站建设程序开发的基本步骤是什么?
  • 专题:2025中国制造业出海与出海品牌社媒影响力洞察报告|附300+份报告PDF、数据、绘图模板汇总下载
  • 【 C/C++ 算法】入门动态规划 ----- 简单多状态 dp 问题》打家劫舍 和 股票买卖问题
  • (114页PPT)华为FusionCloud私有云最佳实践RegionTypeII(附下载方式)
  • 赤壁专业建站公司学做卤味视频网站
  • 3d光学轮廓仪如何局部测量标准台阶?
  • 【数据集+完整源码】水稻病害数据集,yolov8水稻病害检测数据集 6715 张,目标检测水稻识别算法实战训推教程
  • 3D Gaussian Splatting:渲染流程