题目链接:codeforces 1625C
题解
定义 dp[i][j]
为终点为 ,选中 个点所需要的最少时间。状态转移方程: 其中 为 前 个中的任意节点。方程表示,每次选中的 个点是在 中,而不在 中,不断枚举更新,最后求的的答案是 dp[n+1][k]
。
参考代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #include <iostream> #incldue <cstring> using namespace std; const int maxn = 550; int a[maxn], d[maxn], dp[maxn][maxn]; int main() { int n, l, k; cin >> n >> l >> k; for (int i = 1; i <= n; i++) cin >> d[i]; d[n+1] = l; for (int i = 1; i <= n; i++) cin >> a[i]; memset(dp, 0x3f, sizeof dp); for (int i = 0; i <= k; i++) dp[1][i] = 0; for (int i = 2; i <= n+1; i++) { for (int j = 0; j <= k; j++) { for (int u = 1; u < i; u++) { if (j - (i-u-1) < 0) continue; dp[i][j] = min(dp[i][j], dp[u][j-(i-u-1)] + a[u] * (d[i] - d[u])); } } } cout << dp[n+1][k] << endl; return 0; }
|


yngcy
夕拾天星,曦携明露
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。