博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU3480:Division——题解
阅读量:7101 次
发布时间:2019-06-28

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

将一列数划分成几个集合,这些集合的并集为该数列,求每个数列的(最大值-最小值)^2的和的最小值。

简单的dp都会写,就不讲了。

然后就是四边形优化了,参考:

事实上四边形优化的条件一般是靠打表打出来的。

于是简单记录下吧:

先排序。

设dp[i][j]为前j个数划分成i个集合的最小值,cost[i][j]为i~j的集合价值。

显然有dp[i][j]=min{dp[i][j],dp[i][k]+cost[k+1][j]}

接着打表得出(就是打一个矩阵,观察矩阵每行每列都是递增的):

s[i-1][j]<=s[i][j]<=s[i][j+1]

然后就可以利用第三条结论来优化了。

(此外能否用四边形不等式优化还和你如何定义dp也是有关系的……我就是被坑了把dp两个状态倒换一下才行。)

还有一些注意事项看一下吧。

#include
#include
#include
#include
#include
#include
#include
using namespace std;const int N=10010;const int M=5010;const int INF=1e9;inline int read(){ int X=0,w=0;char ch=0; while(!isdigit(ch)){w|=ch=='-';ch=getchar();} while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar(); return w?-X:X;}inline int sqr(int k){ return k*k;}int a[N],dp[M][N],s[M][N];int main(){ int t=read(); for(int cas=1;cas<=t;cas++){ printf("Case %d: ",cas); int n=read(),m=read(); for(int i=1;i<=n;i++)a[i]=read(); sort(a+1,a+n+1); for(int i=1;i<=n;i++){ dp[1][i]=sqr(a[i]-a[1]); s[1][i]=1; } for(int i=2;i<=m;i++){ s[i][n+1]=n-1; for(int j=n;j>=i;j--){ dp[i][j]=INF; for(int k=s[i-1][j];k<=s[i][j+1];k++){ if(dp[i][j]>dp[i-1][k]+sqr(a[j]-a[k+1])){ dp[i][j]=dp[i-1][k]+sqr(a[j]-a[k+1]); s[i][j]=k; } } } } printf("%d\n",dp[m][n]); } return 0;}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:+

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/8830491.html

你可能感兴趣的文章
Docker 快速入门之 Dockerfile
查看>>
VMware Horizon View 7: Deployment and Installation [Part 1]
查看>>
wss3 upgrade wizard失败后的强制打补丁法
查看>>
实现基于文件验证的vsftpd 虚拟用户
查看>>
因为痛,而忍受着
查看>>
Tomcat+Memcached实现Session共享
查看>>
磁盘调度策略
查看>>
【C#】扩展方法的应用
查看>>
case语法
查看>>
CentOS-6.7下安装Oracle11g
查看>>
spring的bean管理(注解方式)
查看>>
Struts2 Action 动态传参数
查看>>
Tomcat 安装webalizer
查看>>
bash的快捷键
查看>>
TCP连接状态详解及TIME_WAIT过多的解决方法
查看>>
12c datagurad 创建临时表空间遇到的问题
查看>>
ASM
查看>>
测试部署Ex2003和LCS2003
查看>>
跟我一起玩VSTS1--安装
查看>>
VMware内存分配初探
查看>>