hdu 4960 Another OCD Patient(dp)
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)的更多相关文章
- HDU 4960 Another OCD Patient(记忆化搜索)
HDU 4960 Another OCD Patient pid=4960" target="_blank" style="">题目链接 记忆化 ...
- hdu 4960 Another OCD Patient (最短路 解法
http://acm.hdu.edu.cn/showproblem.php?pid=4960 2014 Multi-University Training Contest 9 Another OCD ...
- HDU 4960 Another OCD Patient 简单DP
思路: 因为是对称的,所以如果两段是对称的,那么一段的前缀和一定等于另一段的后缀和.根据这个性质,我们可以预处理出这个数列的对称点对.然后最后一个对称段是从哪里开始的,做n^2的DP就可以了. 代码: ...
- hdu 4960 记忆化搜索 DP
Another OCD Patient Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Ot ...
- HDU_4960 2014多校9 Another OCD Patient DP
其实现在想起来是个巨简单的DP,模型就跟LCS很像,比赛的时候居然没想出来,在聪哥提醒下还卡了个地方 就是说给定一串n个数字的序列,可以连续合并,最终使得序列是回文的,题目也给定了合并数字所需的代价, ...
- HDU4960Another OCD Patient(间隙dp,后座DP)
Another OCD Patient Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Ot ...
- HDU 4960 (水dp)
Another OCD Patient Problem Description Xiaoji is an OCD (obsessive-compulsive disorder) patient. Th ...
- HDU 1003 Max Sum --- 经典DP
HDU 1003 相关链接 HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...
- hdu 5094 Maze 状态压缩dp+广搜
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092176.html 题目链接:hdu 5094 Maze 状态压缩dp+广搜 使用广度优先 ...
随机推荐
- 本机jdbc连接报The user specified as a definer ('root'@'%') does not exist
昨晚一台测试服务器连接本机的mysql时,有些调用存储过程报"The user specified as a definer ('root'@'%') does not exist" ...
- 硬连接与软连接,inode与links
硬连接和软连接,第一感觉就像是window的快捷方式,实则不然 要说硬连接和软连接,那就必须了解inode和block以及分区了 EXT文件系统在创建分区的时候,就划分了两块区域,inode tabl ...
- Reapp - 下一代的 Hybrid App 开发框架
Reapp 与 React Native 有着惊人的相似之处,二者都使用 React 来创建应用程序用户界面的框架.然而,在底层机制上这两个框架之间却具有明显的哲学差异.React Native 将 ...
- #8.11.16总结#CSS常用样式总结(二)
border 边框 简写:border:1px solid #000; 等效于:border-width:1px;border-style:solid;border-color:#000; 顺序:b ...
- 微信不支持Object.assign
微信不支持Object.assign,让我Vue怎么用QAQ... 解决方法: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Refe ...
- Emacs学习心得之 基础操作
作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Emacs学习心得之 基础操作 1.前言与学习计划2.Emacs基础操作 一. 前言与学习计 ...
- Android PopupWindow的使用和分析
Android PopupWindow的使用和分析 PopupWindow使用 PopupWindow这个类用来实现一个弹出框,可以使用任意布局的View作为其内容,这个弹出框是悬浮在当前activi ...
- CSS 遗漏点
link属性:链接的颜色(如果改成白色什么都看不见) alink属性:active点击之后的链接的颜色 vlink属性:visited点击之后的颜色 bgcolor属性:背景颜色 word-break ...
- Android 手机卫士--构建服务端json、请求网络数据
本文地址:http://www.cnblogs.com/wuyudong/p/5900384.html,转载请注明源地址. 数据的传递 客户端:发送http请求 http://www.oxx.com/ ...
- SVProgressHUD进度条蒙版
GitHub:https://github.com/samvermette/SVProgressHUDSVProgressHUD和MBProgressHUD效果差不多,不过不需要使用协议,同时也不需要 ...