P6005 [USACO20JAN]Time is Mooney G:DP

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章