社区讨论

最后一个点为什么输出0呀

P1070[NOIP 2009 普及组] 道路游戏参与者 5已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mi6obrlf
此快照首次捕获于
2025/11/20 08:09
4 个月前
此快照最后确认于
2025/11/20 08:09
4 个月前
查看原帖
RT 我是设的 dp[i,j]dp[i,j] 为第 ii 秒时机器人在 jj 的最优解
CPP
#include <iostream>
#include <cstdio>

#define lst(x) ((x == 1) ? N : x - 1)

const int MaxN = 1e3 + 5;

int N, M, P;
int A[MaxN][MaxN], Cost[MaxN], Dp[MaxN][MaxN], Time[MaxN][MaxN], Max[MaxN];

inline int read()
{
    register int x = 0;
    register char ch = getchar();
    while(!isdigit(ch)) ch = getchar();
    while(isdigit(ch))
    {
        x = (x << 1) + (x << 3) + ch - '0';
        ch = getchar();
    }
    return x;
}

int main()
{
    N = read();
    M = read();
    P = read();
    for(int i = 1; i <= N; ++i)
        for(int j = 1; j <= M; ++j)
            A[i][j] = read();
    for(int i = 1; i <= N; ++i) Cost[i] = read();
    for(int i = 1; i <= N; ++i)
    {
        Time[1][i] = 1;
        Dp[1][i] = -Cost[lst(i)] + A[lst(i)][1];
        Max[1] = std::max(Max[1], Dp[1][i]);
    }
    for(int i = 2; i <= M; ++i)
    {
        for(int j = 1; j <= N; ++j)
        {
            Time[i][j] = 1;
            Dp[i][j] = Max[i - 1] - Cost[lst(j)] + A[lst(j)][i];
            if(Time[i - 1][lst(j)] < P && Dp[i][j] < Dp[i - 1][lst(j)] + A[lst(j)][i])
            {
                Time[i][j] = Time[i - 1][lst(j)] + 1;
                Dp[i][j] = Dp[i - 1][lst(j)] + A[lst(j)][i];
            }
            Max[i] = std::max(Max[i], Dp[i][j]);
        }
    }
    printf("%d\n", Max[M]);
    return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...