观察下题目的状态,可设计出一个较为直接的方程。
对于,
代表当前时间,
代表机器人即将走第几步,
表示从第几个工厂出发。
则有:
时,
时,
(一开始写的时候把时的方程写错了,丑)
边界就是
然后空间是不够的,易见第一维可以滚掉。
然后优化下就可以卡过此题。
#include<iostream> #include<cstdio> void read(int &s); #define inf 1000000000 #define rep(i,a,b) for(int i=(a);i<=(b);i++) using namespace std; const int maxn=1010; int maxx(int a,int b){return a<b?b:a;} int n,m,p,hf[maxn],v[maxn][maxn],f[2][maxn][maxn]; int jian(int a){a--;return (a==0)?n:a;} int main(){ read(n);read(m);read(p); rep(i,1,n) rep(j,1,m) read(v[i][j]); rep(i,1,n) read(hf[i]); int mx0=-inf,mx=-inf,no=1; rep(st,1,n)f[0][1][st]=v[st][1]-hf[st],mx0=mx=maxx(mx,f[0][1][st]); rep(t,2,m){ rep(st,1,n){ f[no][1][st]=mx0+v[st][t]-hf[st],mx=maxx(mx,f[no][1][st]); for(int cur=2;cur<=p&&cur<=t;cur++) f[no][cur][st]=f[1-no][cur-1][jian(st)]+v[st][t], mx=maxx(mx,f[no][cur][st]); } mx0=mx;mx=-inf; no=1-no; } cout<<mx0; return 0; } void read(int &s){ int k=1;s=0;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')k=-1;ch=getchar();} while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();} s*=k; }