比较好的dp。。。
dp方程被我一眼想出来。。。。我偷瞄一下题解。。。。发现还是对的。。。。
自己看 代码。。。。
总体复杂度有
这个要优化的话,可以套个优先/单调队列优化成
#include<bits/stdc++.h>
using namespace std;
int n,m,p,gd[1005][1005],cost[1005];
int f[1005],sum[1005][1005];
void init(){
cin>>n>>m>>p;
for(int i = 0 ; i < n ; i++)
for(int j = 1 ; j <= m ; j++)scanf("%d" , &gd[j][i]);
for(int i = 0 ; i < n ; i++)scanf("%d" , &cost[i]);
memset(f , -0x7f , sizeof(f));
f[0] = 0;
memset(sum , 0 , sizeof(sum));
for(int i = 1 ; i <= m ; i++){
for(int j = 0 ; j < n ; j++){
sum[i][j] = sum[i-1][(j - 1 + 3 * n) % n] + gd[i][j];
}
}
}
void solve(){
for(int i = 1 ; i <= m ; i++){
for(int j = 0 ; j < n ; j++){
for(int k = 0 ; k < min(i , p) ; k++){
f[i] = max(f[i] , f[i - k - 1] + sum[i][j] - sum[i - k - 1][(j - k - 1 + 3 * n) % n] - cost[(j - k + 3 * n) % n]);
}
}
for(int j = 0 ; j < n ; j++)jl[i][j] = f[i] - sum[i][j] - cost[j];
}
cout<<f[m]<<endl;
}
int main(){
init();
solve();
}