HDU 4960:Another OCD Patient

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4960

题目大意:有$n$个数$v_i$,现要求将相邻的一些数合并使得合并后为回文数列,将$k$个数合并需要代价$a[k]$,一个数只能被合并一次,问最小代价。

分治+记忆化

代码如下:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #define N 5005
 5 using namespace std;
 6 typedef long long ll;
 7 const ll inf=1000000000000000;
 8 ll n,v[N],a[N],pre[N],ans,l,r,dp[N];
 9 ll solve(ll l,ll r){
10     if(l<1||r>n)return inf;
11     if(dp[l]!=-1)return dp[l];
12     ll lt=l--,rt=r++;
13     dp[lt]=a[lt]+a[n-rt+1];
14     while(1<=l&&r<=n){
15         ll L=pre[l],R=pre[n]-pre[r-1];
16         if(L==R){
17             dp[lt]=min(dp[lt],a[lt-l]+a[r-rt]+solve(l,r));
18             l--;
19         }else if(L>R){
20             l--;
21         }else r++;
22     }
23     return dp[lt];
24 }
25 int main(void){
26     while(~scanf("%lld",&n)){
27         if(n==0)break;
28         memset(dp,-1,sizeof(dp));
29         for(int i=1;i<=n;++i){
30             scanf("%lld",&v[i]);
31             pre[i]=pre[i-1]+v[i];
32         }
33         for(int i=1;i<=n;++i)
34             scanf("%lld",&a[i]);
35         ans=a[n],l=1,r=n;
36         while(l<r){
37             ll L=pre[l],R=pre[n]-pre[r-1];
38             if(L==R){
39                 ans=min(ans,solve(l,r)+a[r-l-1]);
40                 l++;
41             }else if(L<R){
42                 l++;
43             }else r--;
44         }
45         printf("%lld\n",ans);
46     }
47 }

转载于:https://www.cnblogs.com/barrier/p/6864005.html

HDU 4960:Another OCD Patient相关推荐

  1. Java算法_优先队列和PriorityQueue——HDU 1873:看病要排队

    目录 优先队列和PriorityQueue HDU 1873:看病要排队 java.util.Comparator 优先队列和PriorityQueue java.util.PriorityQueue ...

  2. HDU 3507:Print Article

    HDU 3507:Print Article 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3507 题目大意:给定$n$,$m$,输出序列$n$个数, ...

  3. HDU 6146:Pokémon GO

    HDU 6146:Pokémon GO 题目 Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...

  4. HDU 1498:50 years, 50 colors(二分图匹配)

    http://acm.hdu.edu.cn/showproblem.php?pid=1498 题意:给出一个 n*n 的矩阵,里面的数字代表一种颜色,每次能炸掉一排或者一列的相同颜色的气球,问有哪些颜 ...

  5. HDU 4283:You Are the One(区间DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=4283 题意:有n个数字,不操作的情况下从左到右按顺序输出,但是可以先让前面的数字进栈,让后面的数字输出,然后栈里 ...

  6. HDU 2444:The Accomodation of Students(二分图判定+匹配)

    http://acm.hdu.edu.cn/showproblem.php?pid=2444 题意:给出边,判断这个是否是一个二分图,并求最大匹配. 思路:先染色法求出是否是一个二分图,然后再匈牙利求 ...

  7. HDU 5025:Saving Tang Monk(BFS + 状压)

    http://acm.hdu.edu.cn/showproblem.php?pid=5025 Saving Tang Monk Problem Description <Journey to t ...

  8. HDU 5794:A Simple Chess(Lucas + DP)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5794 题意:让一个棋子从(1,1)走到(n,m),要求像马一样走日字型并只能往右下角走.里 ...

  9. HDU 1827:Summer Holiday(强连通)

    http://acm.hdu.edu.cn/showproblem.php?pid=1827 思路:强连通分量缩点后找入度为0的点,然后对于属于该强连通分量的找一个最小耗费的入口. 1 #includ ...

  10. HDU 3652:B-number(数位DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=3652 题意:求数位含有13和可以被13整除的数字个数. 思路:记录3种状态: st == 0 表示 从最高位到第 ...

最新文章

  1. 赠书 | GNN 模型在生物化学和医疗健康中的典型应用
  2. Android 蓝牙开发浅析
  3. Spring Security OAuth2源码解析(三)——单点登录。
  4. AWD-LSTM为什么这么棒?
  5. 视频领域的Instagram:Viddy用户突破2600万
  6. Python 俄罗斯方块, 基于pyqt5实现俄罗斯方块 --pyqt5 进阶
  7. C#日期函数所有样式大全
  8. Python入门--多态
  9. Linux php.ini设置date.timezone=XXX为什么不生效?
  10. HAOI2018 反色游戏
  11. 年终将至,财务人如何做好数据分析?
  12. android矢量地图画法_Android 我们的矢量地图,放大不失真
  13. Selenium分布式运行:SeleniumGrid
  14. addEventListener兼容性问题
  15. FANUC机器人的奇异点回避功能说明
  16. android设备内部添加apn信息
  17. 矩阵对角线求和C++
  18. 线程同步(7种同步方法)
  19. Vitalik Buterin 《以太坊紫皮书》
  20. Intellij idea 第一天

热门文章

  1. 微软2014校园招聘笔试编程题
  2. 为FishBot模型注入物理属性并在Gazebo中显示
  3. JS面向对象/继承/原型链/this指向/call方法
  4. 制作简单的指纹图集,并对其进行处理
  5. docker pull xxx 失败 超时 timeout
  6. Linux 进程通信 -- 管道
  7. 小程序商城制作一个需要多少钱
  8. C++模板偏特化和全特化
  9. win10 EFI分区迁移至新盘的方法
  10. shipyard安装不迷茫