題目來源: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;
}