马
马
题意
有
- 将任意一个数
; - 将任意一个数
; - 将任意一个数
。
给出每种操作的个数,你可以以任意顺序执行任意操作。
求最多执行多少个操作,使得操作结束后任意
思路
定义
状态转移方程(类似于完全背包的转移):
为确保不会溢出,转移时可以先判断是否
状态数:
空间可以使用滚动数组优化,
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 305;
int n, m, ans;
int a, b, c;
int dp[2][301][301][301];
bool ok[2][301][301][301];
int main() {
freopen("horse.in", "r", stdin);
freopen("horse.out", "w", stdout);
cin >> n >> m;
cin >> a >> b >> c;
dp[0][0][0][0] = 1, ok[0][0][0][0] = 1;
for (int i = 1, p = 1; i <= n; i ++, p ^= 1) {
for (int j = 0; j <= a; j ++) {
for (int k = 0; k <= b; k ++) {
for (int l = 0; l <= c; l ++) {
dp[p][j][k][l] = 1e9, ok[p][j][k][l] = 0;
if (ok[p ^ 1][j][k][l]) dp[p][j][k][l] = 1;
if (j && ok[p][j - 1][k][l]) dp[p][j][k][l] = min(dp[p][j][k][l], dp[p][j - 1][k][l] + 50);
if (k && ok[p][j][k - 1][l]) dp[p][j][k][l] = min(dp[p][j][k][l], dp[p][j][k - 1][l] + 20);
if (l && ok[p][j][k][l - 1]) dp[p][j][k][l] = min(dp[p][j][k][l], dp[p][j][k][l - 1] * 2);
ok[p][j][k][l] = (dp[p][j][k][l] <= 100);
if (ok[p][j][k][l]) ans = max(ans, j + k + l);
}
}
}
}
cout << ans << "\n";
return 0;
}
本文来自博客园,作者:maniubi,转载请注明原文链接:https://www.cnblogs.com/maniubi/p/18548136,orz
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】