数据太水了。
查看原帖
数据太水了。
1007758
Nasaepa楼主2024/11/22 00:30

rt

我拿一个 O(nmp)O(nmp) 的 dp 去递交 AC 了,如果这道题上极限数据的话会爆掉。

AC 记录

原代码:

// #pragma GCC optimize(2) // 开启O2优化
#include<bits/stdc++.h>
using namespace std;
#define N 2010
#define INF 0x3f3f3f3f // 无穷大
#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
#define func function<void()>
// 先考虑一个 O(nmp) 的转移
ll dp[N][N];// 表示当前时间为 i 位置为 j
ll maxn[N];
ll a[N][N];
ll v[N];
int n,m,p,ki,kj;
ll sum,ans;

// 输入函数
void input(){
    scanf("%d%d%d",&n,&m,&p);
    for(int i = 1;i <= m;++i)memset(dp[i],-0x3f,sizeof(dp[i]));
    memset(maxn,-0x3f,sizeof(maxn));
    maxn[m+1] = 0;
    for(int i = 1;i <= n;++i){
        for(int j = 1;j <= m;++j)scanf("%lld",a[j] + i);
    }
    for(int i = 1;i <= n;++i)scanf("%lld",v+i);
}

// 处理函数
void solve(){
    for(int i = m;i >= 1;--i){
        for(int j = 1;j <= n;++j){
            kj = j;
            sum = 0;
            for(int k = 1;k <= p;++k){
                if(i + k > m + 1)break;// 不能超过
                sum += a[i + k - 1][kj];
                if(kj == n)kj = 1;
                else ++kj;
                dp[i][j] = max(dp[i][j],maxn[i+k] + sum - v[j]);
            }
            maxn[i] = max(maxn[i],dp[i][j]);
        }
    }
}

// 输出函数
void output(){
//    for(int i = 1;i <= n;++i)ans = max(ans,dp[1][i]);
    printf("%lld",maxn[1]);
}

// 主函数
int main(int argc,char* argv[]){
	input();
	solve();
	output();
	return 0;
}
2024/11/22 00:30
加载中...