【JZOJ 6559】Time is Mooney

题目大意:

\(N\) 个城市,由 \(M\) 条单向道路连接,每次去城市 \(i\) 都能赚 \(m_i\) 元,但是每去一个城市都会花费一天,旅行 \(T\) 天就要花费 \(C\cdot T^{2}\) 元,求最多能赚到多少钱。

正文:

考虑用动态规划解决本题,设 \(f_{i,j}\) 表示第 \(i\) 天在城市 \(j\) 时赚到的钱。那么目标状态显然是 \((f_{T,1}-C\cdot T^{2})\)

动态转移方程是:

\[f_{i,j}=\max\{f_{i-1,k}+m_j\} \]

因为是单向边,在用邻接表存图的时候最好是倒着存,以辅助动态转移,那么方程式中的 \(k\) 代表上一个城市,也就是代码(见下文)中的 \(e[i].to\)

代码:


memset(f, -1, sizeof f);
f[0][1] = 0;
for (int i = 1; i <= N - 10; i++)
	for (int j = 1; j <= n; j++)
		for (int I = head[j]; I; I = e[I].next)
			if(f[i - 1][e[I].to] != -1)
				f[i][j] = max(f[i][j], f[i - 1][e[I].to] + a[j]);

for (int i = 1; i < N - 10; i++)
	ans = max(f[i][1] - c * i * i, ans);
posted @ 2020-04-12 23:19  Jayun  阅读(156)  评论(0编辑  收藏  举报