博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 4960 Another OCD Patient(记忆化搜索)
阅读量:6081 次
发布时间:2019-06-20

本文共 1049 字,大约阅读时间需要 3 分钟。

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;}

转载地址:http://hzkwa.baihongyu.com/

你可能感兴趣的文章
如何快速开发网站?
查看>>
tomcat等服务器返回给页面的数字分别表示的意思!
查看>>
我的友情链接
查看>>
个人博客
查看>>
我的友情链接
查看>>
mysql 参数 innodb_flush_log_at_trx_commit
查看>>
Windows Server 2012 远程桌面,你需要具有通过远程桌面服务进行登录的权限
查看>>
Linux流量监控工具 – iftop
查看>>
【VMCloud云平台】SCCM(八)OSD(四)
查看>>
JavaTM Virtual Machine Profiler Interface (JVMPI)
查看>>
使用IKAnalyzer分词计算文章关键字并分享几个分词词典
查看>>
分布式进程管理
查看>>
Python下用List对员工信息表进行模糊匹配
查看>>
Mysql 主从复制
查看>>
【SQL Server备份恢复】数据库还原
查看>>
Angular js http请求发送和jquery的ajax一样的数据设置方式
查看>>
Andrid在一个程序中启动另一个程序
查看>>
mysql++ (Tserver安装问题)
查看>>
李开复给大支招 大学生创业有五忌
查看>>
大学学习有感
查看>>