设为首页 加入收藏

TOP

HDU 4960 Another OCD Patient(记忆化搜索)
2015-07-20 17:52:10 来源: 作者: 【 】 浏览:1
Tags:HDU 4960 Another OCD Patient 记忆 搜索

HDU 4960 Another OCD Patient

题目链接

记忆化搜索,由于每个碎片值都是正数,所以每个前缀和后缀都是递增的,就可以利用twopointer去找到每个相等的位置,然后下一个区间相当于一个子问题,用记忆化搜索即可,复杂度接近O(n^2)

代码:

#include 
  
   
#include 
   
     #include 
    
      using namespace std; const int INF = 0x3f3f3f3f; const int N = 5005; typedef long long ll; int n, a[N], dp[N][N]; ll v[N], pre[N]; 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; }
    
   
  


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDOJ 4964 Emmet 下一篇HDU - 4961 Boring Sum

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: