HDU 4960 Another OCD Patient(记忆化搜索)
2014-08-19 22:51
369 查看
HDU 4960 Another OCD Patient
题目链接记忆化搜索,由于每个碎片值都是正数,所以每个前缀和后缀都是递增的,就可以利用twopointer去找到每个相等的位置,然后下一个区间相当于一个子问题,用记忆化搜索即可,复杂度接近O(n^2)
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 5005;
typedef long long ll;
int n, a
, dp
;
ll v
, pre
;
void init() {
for (int i = 1; i <= n; i++) {
scanf("%I64d", &v[i]);
pre[i] = pre[i - 1] + v[i];
}
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
memset(dp, -1, sizeof(dp));
}
int solve(int l, int r) {
if (dp[l][r] != -1) return dp[l][r];
dp[l][r] = a[r - l + 1];
if (l >= r) return dp[l][r] = 0;
int now = l;
for (int i = r; i >= l; i--) {
while (pre[now] - pre[l - 1] < pre[r] - pre[i - 1] && now < i)
now++;
if (now == i) break;
if (pre[now] - pre[l - 1] == pre[r] - pre[i - 1])
dp[l][r] = min(dp[l][r], a[now - l + 1] + a[r - i + 1] + solve(now + 1, i - 1));
}
return dp[l][r];
}
int main() {
while (~scanf("%d", &n) && n) {
init();
printf("%d\n", solve(1, n));
}
return 0;
}
相关文章推荐
- HDU 4960 Another OCD Patient(记忆化搜索)
- hdu 4960 Another OCD Patient dp(记忆化搜索)
- HDU 4960 Another OCD Patient (记忆化搜索)
- hdu 4960 Another OCD Patient dp(记忆化搜索)
- hdu 4960 Another OCD Patient 多校九 区间DP
- HDU 4960 Another OCD Patient
- hdu 4960 Another OCD Patient 2014 Multi-University Training Contest 9
- hdu 4960 Another OCD Patient
- HDU 4960 Another OCD Patient
- HDU 4960(Another OCD Patient-区间dp)
- HDU 4960 Another OCD Patient(区间dp记忆化搜索)
- Another OCD Patient HDU - 4960 (dp+前缀和)
- 【HDU】4960 Another OCD Patient 【DP】
- hdu 4960 Another OCD Patient(dp)
- HDU_4960 2014多校9 Another OCD Patient DP
- hdu 4960 Another OCD Patient(动态规划)
- HDU-4960 Another OCD Patient (DP)
- HDU 4960:Another OCD Patient
- HDU 4960 Another OCD Patient 区间dp
- hdu 4960 Another OCD Patient(DP)