HDU 4960:Another OCD Patient
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相关推荐
- Java算法_优先队列和PriorityQueue——HDU 1873:看病要排队
目录 优先队列和PriorityQueue HDU 1873:看病要排队 java.util.Comparator 优先队列和PriorityQueue java.util.PriorityQueue ...
- HDU 3507:Print Article
HDU 3507:Print Article 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3507 题目大意:给定$n$,$m$,输出序列$n$个数, ...
- HDU 6146:Pokémon GO
HDU 6146:Pokémon GO 题目 Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- HDU 1498:50 years, 50 colors(二分图匹配)
http://acm.hdu.edu.cn/showproblem.php?pid=1498 题意:给出一个 n*n 的矩阵,里面的数字代表一种颜色,每次能炸掉一排或者一列的相同颜色的气球,问有哪些颜 ...
- HDU 4283:You Are the One(区间DP)
http://acm.hdu.edu.cn/showproblem.php?pid=4283 题意:有n个数字,不操作的情况下从左到右按顺序输出,但是可以先让前面的数字进栈,让后面的数字输出,然后栈里 ...
- HDU 2444:The Accomodation of Students(二分图判定+匹配)
http://acm.hdu.edu.cn/showproblem.php?pid=2444 题意:给出边,判断这个是否是一个二分图,并求最大匹配. 思路:先染色法求出是否是一个二分图,然后再匈牙利求 ...
- HDU 5025:Saving Tang Monk(BFS + 状压)
http://acm.hdu.edu.cn/showproblem.php?pid=5025 Saving Tang Monk Problem Description <Journey to t ...
- HDU 5794:A Simple Chess(Lucas + DP)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5794 题意:让一个棋子从(1,1)走到(n,m),要求像马一样走日字型并只能往右下角走.里 ...
- HDU 1827:Summer Holiday(强连通)
http://acm.hdu.edu.cn/showproblem.php?pid=1827 思路:强连通分量缩点后找入度为0的点,然后对于属于该强连通分量的找一个最小耗费的入口. 1 #includ ...
- HDU 3652:B-number(数位DP)
http://acm.hdu.edu.cn/showproblem.php?pid=3652 题意:求数位含有13和可以被13整除的数字个数. 思路:记录3种状态: st == 0 表示 从最高位到第 ...
最新文章
- 赠书 | GNN 模型在生物化学和医疗健康中的典型应用
- Android 蓝牙开发浅析
- Spring Security OAuth2源码解析(三)——单点登录。
- AWD-LSTM为什么这么棒?
- 视频领域的Instagram:Viddy用户突破2600万
- Python 俄罗斯方块, 基于pyqt5实现俄罗斯方块 --pyqt5 进阶
- C#日期函数所有样式大全
- Python入门--多态
- Linux php.ini设置date.timezone=XXX为什么不生效?
- HAOI2018 反色游戏
- 年终将至,财务人如何做好数据分析?
- android矢量地图画法_Android 我们的矢量地图,放大不失真
- Selenium分布式运行:SeleniumGrid
- addEventListener兼容性问题
- FANUC机器人的奇异点回避功能说明
- android设备内部添加apn信息
- 矩阵对角线求和C++
- 线程同步(7种同步方法)
- Vitalik Buterin 《以太坊紫皮书》
- Intellij idea 第一天