【练习】DP 做题记录
CF1714D——Color with Occurrences
Description
给定一个字符串
Solution
由于同一段可以被染色多次,所以最小代价和顺序无关,由于
而记录答案就用
Code
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
const int MAXN = 105;
int T;
int n, m;
string s;
int dp[MAXN], pre[MAXN];
int flag[MAXN][MAXN];
int len[MAXN], ans[MAXN];
void print(int k) {
if (!k)
return;
print(pre[k]);
printf("%d %d\n", ans[k], k - len[ans[k]] + 1);
return;
}
int main() {
scanf("%d", &T);
while (T--) {
cin >> s;
n = s.length();
s = '0' + s;
memset(dp, 0x3f, sizeof(dp));
memset(pre, 0, sizeof(pre));
memset(flag, 0, sizeof(flag));
scanf("%d", &m);
for (int i = 1; i <= m; i++) {
string t;
cin >> t;
len[i] = t.length();
for (int j = len[i]; j <= n; j++)
if (s.substr(j - len[i] + 1, len[i]) == t)
flag[j][i] = 1;
}
dp[0] = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (!flag[i][j])
continue;
for (int k = i - len[j]; k < i; k++) {
if (dp[k] + 1 < dp[i]) {
pre[i] = k;
ans[i] = j;
dp[i] = dp[k] + 1;
}
}
}
}
if (dp[n] == 0x3f3f3f3f)
printf("-1\n");
else {
printf("%d\n", dp[n]);
print(n);
}
}
return 0;
}
CF1675G——Sorting Pancakes
Description
有
求要使得最终数组中任意一个
Solution
我们可以定义状态
我们可以定义一个前缀和数组
我们可以开始考虑状态转移方程:因为我们转移时,只和右边一个盘子有关,所以前
所以我们只需从后面一个盘子中去
但是我们的时间复杂度为
由于
设
Code
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 255, INF = 1e9;
int n, m, ans;
int a[MAXN], sum[MAXN];
int dp[MAXN][MAXN][MAXN];
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]), sum[i] = sum[i - 1] + a[i];
memset(dp, 0x3f, sizeof(dp));
dp[0][0][m] = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j <= m; j++) {
int minv = INF;
for (int k = m; k >= 0; k--) {
minv = min(minv, dp[i][j][k]);
if (j + k <= m)
dp[i + 1][j + k][k] = min(dp[i + 1][j + k][k], minv + abs(j + k - sum[i + 1]));
}
}
ans = INF;
for (int i = 0; i <= m; i++)
ans = min(ans, dp[n][m][i]);
printf("%d", ans);
return 0;
}
CF1625C——Road Optimization
Description
Solution
Code
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 505, INF = 1e9;
int n, l, k;
int d[MAXN], a[MAXN];
int dp[MAXN][MAXN];
int main() {
scanf("%d %d %d", &n, &l, &k);
for (int i = 1; i <= n; i++)
scanf("%d", &d[i]);
d[n + 1] = l;
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
memset(dp, 0x3f, sizeof(dp));
for (int i = 0; i <= k; i++)
dp[1][i] = 0;
for (int i = 2; i <= n + 1; i++)
for (int j = 0; j <= min(i - 1, k); j++)
for (int u = 0; u <= j; u++)
dp[i][j] = min(dp[i][j], dp[i - u - 1][j - u] + (d[i] - d[i - u - 1]) * a[i - u - 1]);
int ans = INF;
for (int i = 0; i <= k; i++)
ans = min(ans, dp[n + 1][i]);
printf("%d", ans);
return 0;
}
本文来自博客园,作者:zhou_ziyi,转载请注明原文链接:https://www.cnblogs.com/zhouziyi/p/16588224.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!