Another OCD Patient

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 645    Accepted Submission(s): 238

Problem Description

Xiaoji is an OCD (obsessive-compulsive disorder) patient. This morning, his children played with plasticene. They broke the plasticene into N pieces, and put them in a line. Each piece has a volume Vi. Since Xiaoji is an OCD patient, he can't stand with the disorder of the volume of the N pieces of plasticene. Now he wants to merge some successive pieces so that the volume in line is symmetrical! For example, (10, 20, 20, 10), (4,1,4) and (2) are symmetrical but (3,1,2), (3, 1, 1) and (1, 2, 1, 2) are not.
However, because Xiaoji's OCD is more and more serious, now he has a strange opinion that merging i successive pieces into one will cost ai. And he wants to achieve his goal with minimum cost. Can you help him?
By the way, if one piece is merged by Xiaoji, he would not use it to merge again. Don't ask why. You should know Xiaoji has an OCD.

Input

The input contains multiple test cases.
The first line of each case is an integer N (0 < N <= 5000), indicating the number of pieces in a line. The second line contains N integers Vi, volume of each piece (0 < Vi <=10^9). The third line contains N integers ai (0 < ai <=10000), and a1 is always 0.
The input is terminated by N = 0.

Output

Output one line containing the minimum cost of all operations Xiaoji needs.

Sample Input


5
6 2 8 7 1
0 5 2 10 20
0

Sample Output


10



Hint

In the sample, there is two ways to achieve Xiaoji's goal.
[6 2 8 7 1] -> [8 8 7 1] -> [8 8 8] will cost 5 + 5 = 10.
[6 2 8 7 1] -> [24] will cost 20.

Author

SYSU

Source

2014 Multi-University Training Contest 9

今天比赛的时候想到记忆化搜索,时间复杂度n^2logn,不过想想实际,也就n^2的复杂度,因为这个复杂度,怕被卡时间,所以

也没什么信心打,结果跟队友码别的题,码到最后才发现思路错了,囧

view code//按比赛是想法做的,有点可惜,时间800ms
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll;
const int INF = 1<<30;
const int N = 5005;
int n, dp[N][N];
ll sum[N], v[N],a[N];
bool vis[N][N]; int find(int l, int r, ll x)
{
int n = r;
while(l<=r)
{
int m = (l+r)>>1;
if(sum[n]-sum[m-1]==x) return m;
if(sum[n]-sum[m-1]>x) l = m+1;
else r = m-1;
}
return 0;
} int dfs(int l, int r)
{
if(l>=r) return 0;
if(vis[l][r]) return dp[l][r];
vis[l][r] = 1;
int &ans = dp[l][r];
ans = v[r-l+1];
for(int i=l; i<r; i++)
{
int R = find(i+1, r, sum[i]-sum[l-1]);
if(!R) continue;
ans = min((ll)ans, (ll)(dfs(i+1, R-1)+v[i-l+1]+v[r-R+1]));
}
return ans;
} void solve()
{
for(int i=1; i<=n; i++){
scanf("%I64d", a+i);
sum[i] = sum[i-1] + a[i];
}
for(int i=1; i<=n; i++) scanf("%I64d", v+i);
memset(vis, 0, sizeof(vis));
printf("%d\n", dfs(1,n));
} int main()
{
// freopen("in.txt", "r", stdin);
while(scanf("%d", &n)>0 && n) solve();
return 0;
}

根据比赛是想法的优化,思想差不多,只不过优化了时间空间

view code#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 5010;
int L[N], R[N], cnt;
ll dp[N], sum[N], a[N], v[N], n;
bool vis[N]; int find(int l, int r, ll x)
{
int n = r;
while(l<=r)
{
int m = (l+r)>>1;
if(sum[n]-sum[m-1]==x) return m;
if(sum[n]-sum[m-1]>x) l=m+1;
else r = m-1;
}
return 0;
} void init()
{
cnt = 0;
for(int l=1; l<=n; l++)
{
int r = find(l+1, n, sum[l]);
if(!r) continue;
L[cnt] = l;
R[cnt++] = r;
}
} ll dfs(int pos, int l, int r)
{
if(l>=r) return 0;
if(dp[l]!=-1) return dp[l];
ll& ans=dp[l];
ans = v[r-l+1];
for(int i=pos; i<cnt; i++)
{
ans = min(dfs(i+1, L[i]+1,R[i]-1)+v[L[i]-l+1]+v[r-R[i]+1], ans);
}
return ans;
} void solve()
{
for(int i=1; i<=n; i++){
scanf("%I64d", &a[i]);
sum[i] = sum[i-1]+a[i];
}
for(int i=1; i<=n; i++) scanf("%I64d", v+i);
init();
memset(dp, -1, sizeof(dp));
printf("%I64d\n",dfs(0, 1, n));
} int main()
{
// freopen("in.txt", "r", stdin);
while(scanf("%I64d", &n)>0 && n) solve();
return 0;
}

hdu 4960 Another OCD Patient(dp)的更多相关文章

  1. HDU 4960 Another OCD Patient(记忆化搜索)

    HDU 4960 Another OCD Patient pid=4960" target="_blank" style="">题目链接 记忆化 ...

  2. hdu 4960 Another OCD Patient (最短路 解法

    http://acm.hdu.edu.cn/showproblem.php?pid=4960 2014 Multi-University Training Contest 9 Another OCD ...

  3. HDU 4960 Another OCD Patient 简单DP

    思路: 因为是对称的,所以如果两段是对称的,那么一段的前缀和一定等于另一段的后缀和.根据这个性质,我们可以预处理出这个数列的对称点对.然后最后一个对称段是从哪里开始的,做n^2的DP就可以了. 代码: ...

  4. hdu 4960 记忆化搜索 DP

    Another OCD Patient Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Ot ...

  5. HDU_4960 2014多校9 Another OCD Patient DP

    其实现在想起来是个巨简单的DP,模型就跟LCS很像,比赛的时候居然没想出来,在聪哥提醒下还卡了个地方 就是说给定一串n个数字的序列,可以连续合并,最终使得序列是回文的,题目也给定了合并数字所需的代价, ...

  6. HDU4960Another OCD Patient(间隙dp,后座DP)

    Another OCD Patient Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Ot ...

  7. HDU 4960 (水dp)

    Another OCD Patient Problem Description Xiaoji is an OCD (obsessive-compulsive disorder) patient. Th ...

  8. HDU 1003 Max Sum --- 经典DP

    HDU 1003    相关链接   HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...

  9. hdu 5094 Maze 状态压缩dp+广搜

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092176.html 题目链接:hdu 5094 Maze 状态压缩dp+广搜 使用广度优先 ...

随机推荐

  1. toastr 自定义提示

    在线实例 实例演示 使用方法 <button type="button" class="btn btn-primary" id="showtoa ...

  2. 25个最佳的 WordPress Gallery 画廊插件

    WordPress 画廊插件最适合用于作品展示网站,特别对于那些想以一个奇特的,现代的方式展示他们作品的摄影师.如果你想为你安装 WordPress Gallery 插件,那么下面的是你想要的. 本文 ...

  3. 高性能的JavaScript库---Lodash

    上周在仿做Nodejs社区的时候,遇到了lodash这个javascript库,很惭愧,那也是我第一次听说lodash.人嘛,对于新鲜的事物总是会或多或少感到些好奇的,于是就毫不犹豫地去lodash官 ...

  4. 利用IIS导出,导入快速部署 web站点

    部署负载均衡站点的时候会创建多个站点拷贝.用脚本可以提高效率,并且减少错误 1 以管理员身份运行CMD 2 Cd C:\Windows\System32\inetsrv 3 导出指定的应用程序池 ap ...

  5. MSCRM 报表显示 rsprocessingaborted 错误

    今天又有朋友遇到rsprocessingaborted这个问题,想想这个已经是很老很老的问题了,得在写一遍补充下. 一.首先会考虑是不是SrsDataConnector没有安装的原因,如果正常安装的话 ...

  6. The quieter you become,The more you are able to hear.

  7. iOS自动化编译

    最近研究了一下iOS的自动化编译,目的是为了简化测试和开发的同学沟通协调的次数,实现测试同学可以随时从网页操作编译SVN最新源码并打包ipa进行测试. 具体思路是通过从配置文件读取需要编译的项目配置列 ...

  8. 深入.net(多态一)

    代码优化技术: 当您在 编写一个类时,如果您发现你需要编写的“属性”和“方法”曾经在已有的类中实现,则,您可以将其共用的“属性”和“方法”剪切到一个新的“类”中,然后,让两个类共同继承这个“新类”.( ...

  9. 深入.net(类及方法)

    .net 的命名规则: 帕斯卡命名法 ----- 多个单词说明,且直接连接,并首字母大写(类名.方法名.属性名....) 骆驼命名法---------多个单词说明,且直接连接,并首字母大写,第一个字母 ...

  10. 开放-封闭原则(OCP)开-闭原则 和 依赖倒转原则,单一职责原则

    单一职责原则 1.单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因 2.如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或抑制这个类完成其他职责的能力. ...