题目来源:P6005 [USACO20JAN]Time is Mooney G
要求经过的城市收益最大,但是要减去CII,,M<2000,收益小于1000,所以天数最多不会超过1000天。时间复杂度o(N*M)
题目为有向图,相关因素为天数和路径,无后效性,考虑dp,设dp[i][j]为在第i天到达城市j的收益.求最大值,其中dp[0][1]=0.
参考代码“
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1005;
int n,m,c;
ll val[N],ans,dp[N][N];
struct node {
int to,nxt;
ll w;
} e[N*2];
int head[N],cnt;
void add(int u,int v) {
e[++cnt].to=v;
e[cnt].w=val[v];
e[cnt].nxt=head[u];
head[u]=cnt;
}
int main() {
scanf("%d%d%lld",&n,&m,&c);
for(int i=1; i<=n; i++) scanf("%lld",&val[i]);
for(int i=0; i<m; i++) {
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
}
memset(dp,-1,sizeof(dp));
dp[0][1]=0;
for(int i=1; i<1000; i++) {
for(int u=1; u<=n; u++) {
for(int j=head[u]; j; j=e[j].nxt) {
int v=e[j].to;
ll cost=e[j].w;
if(dp[(i-1)][u]>=0) dp[i][v]=max(dp[i][v],dp[i-1][u]+cost);
}
}
ans=max(ans,dp[i][1]-c*i*i);
}
printf("%lld\n",ans);
return 0;
}