不太会dp的同时又开到一篇dp
非常难想啊!
一直在想n^2log 咋过
其实我最开始想的是n^2加贪心
没想到n^3也能过啊!
还有一种优化就是
将一条对角线上的状态放入一个优先队列 那么就能大概n^2logn辣!
注意:
先枚举时间再枚举点 时间不要超过n 步数不要超过p
因为是从前推后 所以要k=0 i-1 开始循环
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
const int M = 1e4+10;
const int mod = 1e9+7;
#define int long long
#define endl '\n'
#define Endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}
int mp[N][N],dp[N],cost[N];
signed main(){
fast
int n,m,p;cin>>n>>m>>p;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>mp[i][j];
for(int i=1;i<=n;i++)cin>>cost[i];
for(int i=1;i<=m;++i){//初始化
dp[i] = -1e9;//由于有可能有负数解
}
int ans=-2e9;
for(int i=1;i<=m;++i){
for(int j=1;j<=n;++j){
ans = -cost[j]+dp[i-1];
for(int k=0;k<p&&i+k<=m;++k){
int t = j+k > n ? ((j+k)%n) : j+k;
ans += mp[t][i+k];
dp[i+k] = max(dp[i+k],ans);
}
}
}
cout<<dp[m]<<endl;
return 0^0;
}