社区讨论
听灌佬多
灌水区参与者 5已保存回复 18
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 17 条
- 当前快照
- 1 份
- 快照标识符
- @m3cpp3fd
- 此快照首次捕获于
- 2024/11/11 15:38 去年
- 此快照最后确认于
- 2025/11/05 01:32 4 个月前
我发现了一个很神奇的现象:只要将以下代码dp数组中的N和M对调且下面对应的i和j也对调同个大样例原代码0.5s就能跑完而对调后要跑1.2s,貌似时间复杂度变大了但不知道变大在何处,有大佬能解释一下吗qwq
CPP#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 105,M = 2e5 + 5;
ll n,m,k,s,ans,v[N],w[N],dp[N][M][2];
inline ll read()
{
ll x = 0,f = 1;
char c = getchar();
while (!isdigit(c))
{
if (c == 45)
f = -1;
c = getchar();
}
while (isdigit(c))
{
x = (x << 1) + (x << 3) + (c ^ 48);
c = getchar();
}
return x * f;
}
inline void print(ll x)
{
if (x < 0)
{
putchar(45);
x = -x;
}
if (x > 9)
print(x / 10);
putchar(x % 10 ^ 48);
}
inline ll max(ll a,ll b)
{
return a > b ? a : b;
}
int main()
{
freopen("item.in","r",stdin);
freopen("item.out","w",stdout);
n = read(),m = read(),k = read();
for (register int i = 0;i++ < n;v[i] = read(),w[i] = read());
for (register int i = 0;i++ < n;)
for (register int j = m;j >= 0;j--)
{
dp[i][j][0] = max(dp[i - 1][j][0],dp[i - 1][j][1]);
if (v[i] > j)
continue;
dp[i][j][1] = max(dp[i - 1][j][0],max(dp[i - 1][j - v[i]][0] + w[i],dp[i - 1][j - v[i]][1] + w[i] - k));
}
print(max(dp[n][m][0],dp[n][m][1]));
return 0;
}
回复
共 18 条回复,欢迎继续交流。
正在加载回复...