DP Contest
A - Frog 1
发现 只能从 跳过来。
所以转移方程为 。
注意初始化 。
int f[N], h[N], k; signed main() { int n = read(); for(int i = 1; i <= n; i++) h[i] = read(); f[1] = 0, f[2] = abs(h[2] - h[1]); for(int i = 3; i <= n; i++) { f[i] = min(f[i - 1] + abs(h[i] - h[i - 1]), f[i - 2] + abs(h[i] - h[i - 2])); } cout << f[n]; return 0; }
B - Frog 2
这次这次青蛙可以一次跳 里面的任意一步。
转移方程为 。
注意一开始赋极大值。
signed main() { n = read(), k = read(); for(int i = 1; i <= n; i++) a[i] = read(); memset(f, 63, sizeof f); f[1] = 0; for(int i = 2; i <= n; i++) { for(int j = 1; j <= k; j++) { if(i - j >= 1) f[i] = min(f[i], f[i - j] + abs(a[i] - a[i - j])); } } cout << f[n]; return 0; }
C - Vacation
不能连续两天选重复的。
我们设 表示第 天选了第 。
我们如何知道两天不能选重复的?
我们这两天的状态都枚举即可。
转移方程为
int a[N][5]; int dp[N][5]; signed main() { int n = read(); for(int i = 1; i <= n; i++) for(int j = 1; j <= 3; j++) a[i][j] = read(); for(int i = 1; i <= 3; i++) dp[1][i] = a[1][i]; for(int i = 2; i <= n; i++) { for(int j = 1; j <= 3; j++) { for(int k = 1; k <= 3; k++) { if(j != k) dp[i][j] = max(dp[i][j], dp[i - 1][k] + a[i][j]); } } } cout << max(dp[n][1], max(dp[n][2], dp[n][3])); return 0; }
D - Knapsack 1
背包的板子题。
int n, V; ll w[N], val[N], dp[N]; signed main() { n = read(), V = read(); for(int i = 1; i <= n; i++) w[i] = read(), val[i] = read(); for(int i = 1; i <= n; i++) { for(int j = V; j >= w[i]; j--) { dp[j] = max(dp[j], dp[j - w[i]] + val[i]); } } cout << dp[V]; return 0; }
本文作者:TLE_Automation
本文链接:https://www.cnblogs.com/tttttttle/p/16468611.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现