博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU-3480 Division (四边形不等式优化DP)
阅读量:5277 次
发布时间:2019-06-14

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

题目大意:将n个数分成m组,将每组的最大值与最小值的平方差加起来,求最小和。

题目分析:先对数排序。定义状态dp(i,j)表示前 j 个数分成 i 组得到的最小和,则状态转移方程为dp(i,j)=min(dp(i,k-1)+w(k,j)),其中w(i,j)=(a[i]-s[j])*(a[i]-a[j])。很显然,dp(i,j)满足凸四边形不等式。

 

代码如下:

# include
# include
# include
# include
using namespace std;const int INF=1<<30;int dp[10005][505];int K[10005][505];int a[10005];int n,m;void read(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) scanf("%d",a+i);}int solve(){ sort(a+1,a+n+1); for(int i=1;i<=n;++i){ dp[1][i]=(a[i]-a[1])*(a[i]-a[1]); K[1][i]=0; if(i<=m){ dp[i][i]=0; K[i][i]=i; } } for(int i=2;i<=m;++i){ K[i][n+1]=n; for(int j=n;j>=i;--j){ dp[i][j]=INF; for(int k=K[i-1][j];k<=K[i][j+1];++k){ if(dp[i][j]>dp[i-1][k-1]+(a[j]-a[k])*(a[j]-a[k])){ dp[i][j]=dp[i-1][k-1]+(a[j]-a[k])*(a[j]-a[k]); K[i][j]=k; } } } } return dp[m][n];}int main(){ int T,cas=0; scanf("%d",&T); while(T--) { read(); printf("Case %d: %d\n",++cas,solve()); } return 0;}

  

转载于:https://www.cnblogs.com/20143605--pcx/p/5294606.html

你可能感兴趣的文章
[转]Magento Configurable Product
查看>>
HDU 1875(最小生成树)
查看>>
Django中的cookie和session实现
查看>>
Django CMS 插件 – 添加博客专题
查看>>
[C#] C#代码执行cmd命令
查看>>
IDEA(MAC) 快捷键
查看>>
ajax跨域简单请求和复杂请求
查看>>
Java动态加载DLL方法
查看>>
无边框窗体及移动
查看>>
ls按时间排序输出文件列表
查看>>
ZendGuardLoader安装
查看>>
青云直上九宵天 功成名就把家还
查看>>
Mysql初识数据库《二》数据库管理软件的由来
查看>>
日期格式操作,在oracle和mysql中的实现
查看>>
CentOSx64 安装 Gearmand 和 Gearman php扩展
查看>>
linux:SUID、SGID详解
查看>>
小哼买书
查看>>
angular学习之手动启动一个模块
查看>>
初识Tomcat系统架构
查看>>
CSS 三角形
查看>>