洛谷 1063 dp 区间dp
2016-10-30 20:48
232 查看
洛谷 1063 dp 区间dp
感觉做完这道提高组T1的题之后,受到了深深的碾压,,最近各种不在状态。。
初看这道题,不难发现它具有区间可并性,即(i, j)的最大值可以由(i, k) 与 (k+1, j)得到。考虑使用区间dp
题目中项链为环形,所以在2 * n的区间上进行操作
设dp[i][j],表示区间(i, j) 的最大值 转移为
dp[i][j] = max(dp[i][j], dp[i][k] + dp[k+1][j] + pre[i] * succ[k] * succ[j]);
老久没写区间dp题目了,各种手生,开了3倍的空间,在枚举i的时候只枚举了一个n的区间,导致多次错解
丑哭的代码如下:
#include <cstdio> #include <cstring> #include <algorithm> const int maxn = 800 + 10; int dp[maxn][maxn]; int pre[maxn], succ[maxn]; int n; int main () { freopen("energy.in", "r", stdin); freopen("energy.out", "w", stdout); scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &pre[i]); succ[i-1] = pre[i]; } succ = pre[1]; memcpy(&pre[n + 1], &pre[1], sizeof(int) * n); memcpy(&succ[n + 1], &succ[1], sizeof(int) * n); memcpy(&pre[2 * n + 1], &pre[1], sizeof(int) * n); memcpy(&succ[2 * n + 1], &succ[1], sizeof(int) * n); // for (int i = 1; i <= 3 * n; i++) printf("pre[%d] = %d\n", i, pre[i]); // for (int i = 1; i <= 3 * n; i++) printf("succ[%d] = %d\n", i, succ[i]); for (int j = 1; j < n; j++) { for (int i = n + 1; i <= 3 * n; i++) { for (int k = i; k < i + j; k++) dp[i][i+j] = std :: max(dp[i][i+j], dp[i][k] + dp[k + 1][i + j] + pre[i] * succ[k] * succ[i + j]); } } //for (int i = n + 1; i <= 2 * n; i++) // for (int j = i; j <= i + n - 1; j++) { // printf("dp[%d][%d] = %d\n", i, j, dp[i][j]); // } int ans = 0; for (int i = n + 1; i <= 3 * n; i++) { ans = std :: max(ans, dp[i][i + n - 1]); } printf("%d", ans); return 0; }
相关文章推荐
- 洛谷 1063 dp 区间dp
- 洛谷 1063 dp 区间dp
- 洛谷 1063 dp 区间dp
- 洛谷 1063 dp 区间dp
- 洛谷 1063 dp 区间dp
- 洛谷 1063 dp 区间dp
- 洛谷 1063 dp 区间dp
- 洛谷 1063 dp 区间dp
- 洛谷 1063 dp 区间dp
- 洛谷 1063 dp 区间dp
- 洛谷 1063 dp 区间dp
- 洛谷 1063 dp 区间dp
- 洛谷 1063 dp 区间dp
- 洛谷 1063 dp 区间dp
- 洛谷 1063 dp 区间dp
- LuoguP1063 能量项链【区间Dp】
- 洛谷 P3102 [USACO14FEB]秘密代码Secret Code 【区间dp】
- 洛谷 P1220 关路灯 (区间DP)
- 洛谷 P3102 [USACO14FEB]秘密代码Secret Code 【区间dp】
- 洛谷 1063 [NOIP2006] 能量项链 DP