找朋友2
找朋友2
题意
给出
思路
定义
若
时间复杂度:
发现
发现当前有用的状态只有
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 2e4 + 5;
const int M = 2e3 + 5;
int n, m, a[N], dp[M][M], Min[M][M], ans;
void solve() {
cin >> n >> m;
for (int i = 1; i <= n; i ++) cin >> a[i];
for (int j = 0; j <= m; j ++) {
dp[0][j] = Min[0][j] = 0;
}
for (int i = 1; i <= m; i ++) {
for (int j = 0; j <= m; j ++)
dp[i][j] = Min[i][j] = 0x3f3f3f3f;
}
// memset(dp, 0x3f, sizeof(dp));
// memset(Min, 0x3f, sizeof(Min));
ans = 0x3f3f3f3f;
// memset(dp[0], 0, sizeof(dp[0]));
// memset(Min[0], 0, sizeof(Min[0]));
for (int i = 1; i <= n; i ++) {
int now = i % m;
for (int j = 0; j <= m; j ++)
Min[now][j] = 0x3f3f3f3f, dp[now][j] = 0x3f3f3f3f;
for (int j = 1; j <= min(i, m); j ++) {
// int Min = 0x3f3f3f3f;
// for (int k = 1; k <= m - j; k ++) {
// Min = min(Min, dp[i - j][k]);
// }
// dp[i][j] = Min + a[i];
int pre = (i - j + m) % m;
dp[now][j] = Min[pre][m - j] + a[i];
Min[now][j] = min(Min[now][j - 1], dp[now][j]);
if (i >= n - m + 1 + j)
ans = min(ans, dp[now][j]);
// cout << i << " " << j << " " << dp[i][j] << "\n";
}
for (int j = 1; j <= m; j ++)
Min[now][j] = min(Min[now][j], Min[now][j - 1]);
}
cout << ans << "\n";
}
int main() {
freopen("gaoj.in", "r", stdin);
freopen("gaoj.out", "w", stdout);
int Case;
cin >> Case;
while (Case --)
solve();
return 0;
}
本文来自博客园,作者:maniubi,转载请注明原文链接:https://www.cnblogs.com/maniubi/p/18419132,orz
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】