HDU 3480 Division(斜率DP裸题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3480
题目大意:将n个数字分成m段,每段价值为(该段最大值-该段最小值)^2,求最小的总价值。
解题思路:很单纯的斜率优化DP,得出状态转移方程:dp[i][j]=min{dp[k][j-1]+(a[i]-a[k+1])^2}(j-1<=k<i),然后斜率优化降到O(n^2)就好了。
注意:数据类型建议用int,不要用long long,后者乘法计算时间是前者的四倍,否则C++可能会超时。
代码:
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 using namespace std; 6 typedef long long LL; 7 const int N=1e4+5; 8 9 int head,tail; 10 int dp[N][5005],a[N],q[N]; 11 12 int getUP(int m,int k,int j){ 13 return dp[k][j-1]+a[k+1]*a[k+1]-dp[m][j-1]-a[m+1]*a[m+1]; 14 } 15 16 int getDOWN(int m,int k){ 17 return 2*(a[k+1]-a[m+1]); 18 } 19 20 //dp[i][j]=min{dp[k][j-1]+(a[i]-a[k+1])^2} 21 int getDP(int i,int j,int k){ 22 return dp[k][j-1]+(a[i]-a[k+1])*(a[i]-a[k+1]); 23 } 24 25 int main(){ 26 int t,cas=0; 27 scanf("%d",&t); 28 int cnt=0; 29 while(t--){ 30 int n,m; 31 scanf("%d%d",&n,&m); 32 for(int i=1;i<=n;i++){ 33 scanf("%d",&a[i]); 34 } 35 sort(a+1,a+1+n); 36 for(int i=1;i<=n;i++){ 37 dp[i][1]=(a[i]-a[1])*(a[i]-a[1]); 38 } 39 40 for(int j=2;j<=m;j++){ 41 head=tail=0; 42 q[tail++]=j-1; 43 for(int i=j;i<=n;i++){ 44 cnt++; 45 while(head+1<tail&&getUP(q[head],q[head+1],j)<=a[i]*getDOWN(q[head],q[head+1])){ 46 head++; 47 } 48 dp[i][j]=getDP(i,j,q[head]); 49 while(head+1<tail&&getUP(q[tail-1],i,j)*getDOWN(q[tail-2],q[tail-1])<=getUP(q[tail-2],q[tail-1],j)*getDOWN(q[tail-1],i)){ 50 tail--; 51 } 52 q[tail++]=i; 53 } 54 } 55 printf("Case %d: %d\n",++cas,dp[n][m]); 56 } 57 return 0; 58 }
转载于:https://www.cnblogs.com/fu3638/p/7850650.html
HDU 3480 Division(斜率DP裸题)相关推荐
- HDU 2196 Computer 树形DP经典题
链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...
- hdu 3480 斜率dp
思路:很普通的斜率dp #include<cstdio> #include<cstring> #include<iostream> #include<algo ...
- 【POJ - 3624 】Charm Bracelet (dp,0-1背包裸题)
题干: Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like to ...
- HDU 3669 Cross the Wall(斜率DP+预处理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3669 题目大意:有n(n<=50000)个矩形,每个矩形都有高和宽,你可以在墙上最多挖k个洞使得 ...
- 【HDU - 1102】Constructing Roads (最小生成树裸题模板)
题干: There are N villages, which are numbered from 1 to N, and you should build some roads such that ...
- HDU 5755 Gambler Bo(高斯消元裸题)——2016 Multi-University Training Contest 3
传送门 Gambler Bo Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- hdu 6899 Xor 数位dp
传送门 文章目录 题意: 思路: 题意: 问你有多少对x,yx,yx,y满足以下条件: (1)x∈[0,A],y∈[0,B](1)x \in [0,A],y\in [0,B](1)x∈[0,A],y∈ ...
- [SCU 4509] Snowdrop修长廊 (斜率DP)
SCU - 4509 使用若干条线段,覆盖坐标轴上的 N个点 覆盖 [i,j][i, j]的代价为cost(i,j)=W+(xi−xj)2cost(i,j) = W + (x_i-x_j)^2 求覆盖 ...
- 【CodeVS - 3639】(树的重心模板,裸题)
题干: 题目描述 Description 给出一棵树,求出树的中心. 为了定义树的中心,首先给每个结点进行标号.对于一个结点K,如果把K从树中删除(连同与它相连的边一起),剩下的被分成了很多块,每一块 ...
- 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★
昨天的每日DP我还在写01背包,今天就到状压DP了,真刺激. P1879 [USACO06NOV]Corn Fields G 题目链接 输入 2 3 1 1 1 0 1 0 输出 9 一道简单的状压D ...
最新文章
- Power Designer使用技巧
- 网站新手引导/步骤引导
- iOS 不要用文本编辑pod file
- 小明分享|nRF52840 蓝牙模块连接测试
- 欢乐纪中某A组赛【2019.7.9】
- spring boot的学习(1)杂
- [serial]基于select/poll/epoll的串口操作
- 66.为什么有时候在ISE软件中,顶层文件不能置顶?
- 【数论思维题】Enlarge GCD【Codeforces Round #511 (Div. 2)】
- 计算机控制系统烤箱温度控制,图说恒温烘箱温度控制系统的设计分析
- 冯扬文:基于数据仓库的集装箱运价信息集成研究
- 结果公示!400名博硕士获“优秀学位论文”奖!
- python文件查重_使用Python查找目录中的重复文件
- vue之表格数据渲染,实现点击表格某列按钮弹出框显示剩余数据(模态框知识点)
- 产品读书《数字化生存》
- 百度云和ai开放平台关系_集成平台即服务,云和……独角兽
- ATFX:美国服务业持续收缩,科技股前景如何?
- R语言 CART算法和C4.5算法(决策树)
- awd——waf部署
- 牛客第八场_E-Enigmatic Partition(神仙差分)