社区讨论
关于优化
P9871[NOIP2023] 天天爱打卡参与者 4已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mii1z0x3
- 此快照首次捕获于
- 2025/11/28 07:16 3 个月前
- 此快照最后确认于
- 2025/11/29 13:20 3 个月前
基于 的动态规划有没有优化的可能
CPP#include <iostream>
#include <cstring>
#include <algorithm>
#define big long long
using namespace std;
big _,T,n,m,lim,d,idx,ans;
big dp[1003][1003]; // 运行到第 i 天,目前已经连续打卡了 j 天,最大能量值
big bonus[1003][1003];
int main()
{
// freopen("run2.in","r",stdin);
// freopen("run.out","w",stdout);
scanf("%lld %lld",&_,&T);
while(T--)
{
memset(bonus,0,sizeof bonus);
scanf("%lld %lld %lld %lld",&n,&m,&lim,&d);
for(big i = 1,a,b,c;i <= m;i++)
{
scanf("%lld %lld %lld",&a,&b,&c);
bonus[a][b] += c;
}
for(big i = 1;i <= n;i++)
{
for(big j = 1;j <= n;j++)
{
bonus[i][j] += bonus[i][j-1];
}
}
memset(dp,-0x3f,sizeof dp);
dp[0][0] = 0; idx = 1;
ans = -1e18;
for(big i = 1;i <= n;i++)
{
for(big j = 0;j <= lim;j++)
{
dp[i][0] = max(dp[i-1][j]+bonus[i][0],dp[i][0]);
if(j >= 1) dp[i][j] = max(dp[i-1][j-1]+bonus[i][j]-d,dp[i][j]);
ans = max(ans,dp[i][j]);
// if(j >= 1) printf("dp[%lld][%lld] = %lld\n",i,j,dp[i][j]);
}
ans = max(ans,dp[i][0]);
// printf("dp[%lld][%lld] = %lld\n",i,0,dp[i][0]);
}
printf("%lld\n",ans);
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...