社区讨论

关于优化

P9871[NOIP2023] 天天爱打卡参与者 4已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mii1z0x3
此快照首次捕获于
2025/11/28 07:16
3 个月前
此快照最后确认于
2025/11/29 13:20
3 个月前
查看原帖
基于 nn 的动态规划有没有优化的可能
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 条回复,欢迎继续交流。

正在加载回复...