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;
}

发布了118 篇原创文章 · 获赞 25 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/lengxuenong/article/details/104588252