习题:就是干(DP)

洛谷2301

题目描述

眼看着老师大军浩浩荡荡的向机房前进。LOI 的同学们决定动用自己的力量来保卫他们的好朋友loidc。现在每个人都要挑选自己的武器——两根木棍。一根用做远距离投掷,另一根用做近距离搏斗。每个人都想挑到最好的,但这是不可能的。但是为了让多数人满意,也为了减少大家的矛盾。cony设计了一个矛盾指数,这个指数就是每个人的不舒服指数和,不舒服指数就(L1-L2)^2,其中L1,L2分别是两根木棍的长度。

cony决定让矛盾指数最少,于是他来向你寻求帮助,希望你能告诉他矛盾指数至少有多少。

输入输出格式

输入格式:
第一行两个数m,n.

表示有n个人,m个木棍。

接下来m个数表示每个木棍(肯定有解)。

(m<=2000,n<=500)

输出格式:
一个数,最少的矛盾指数。

输入输出样例

输入样例#1:
5 2
3
1
4
5
8
输出样例#1:
5

分析:

先排序,显然组成一对的木棍必相邻才是最优的。

故得到方程

f[i,j]=min(f[i-1,j],f[i-2,j-1]+sqr(a[i]-a[i-1])) i=2..m

初值f[i,0]:=0;

代码:

program work;
var
  f:array[0..2000,0..500]of int64;
  a:array[0..2000]of int64;
  n,i,m,j:longint; t:int64;
function min(x,y:int64):int64;
begin
  if x<y then min:=x else min:=y;
end;
begin
  readln(m,n);
  for i:=1 to m do  readln(a[i]);
  for i:=1 to m-1 do
   for j:=i+1 to m do
    if a[i]>a[j] then
     begin t:=a[i]; a[i]:=a[j]; a[j]:=t; end;
  for i:=0 to m do
   for j:=1 to n do f[i,j]:=maxlongint*100;
  f[1,0]:=0; f[0,0]:=0;
  for i:=2 to m do
   for j:=1 to min(m div 2,n) do
    f[i,j]:=min(f[i-1,j],f[i-2,j-1]+sqr(a[i]-a[i-1]));
  writeln(f[m,n]);
end.

时间: 2024-11-06 17:16:03

习题:就是干(DP)的相关文章

Acwing-277-饼干(DP)

链接: https://www.acwing.com/problem/content/279/ 题意: 圣诞老人共有M个饼干,准备全部分给N个孩子. 每个孩子有一个贪婪度,第 i 个孩子的贪婪度为 g[i]. 如果有 a[i] 个孩子拿到的饼干数比第 i 个孩子多,那么第 i 个孩子会产生 g[i]*a[i]的怨气. 给定N.M和序列g,圣诞老人请你帮他安排一种分配方式,使得每个孩子至少分到一块饼干,并且所有孩子的怨气总和最小. 思路: 先考虑贪心,怨气较大的人得到的饼干肯定较多. 可以先进行排

【不可能的任务5/200】uva12063数位dp

辣鸡军训毁我青春!!! 因为在军训,导致很长时间都只能看书yy题目,而不能溜到机房鏼题 于是在猫大的帮助下我发现这道习题是数位dp 然后想起之前讲dp的时候一直在补作业所以没怎么写,然后就试了试 果然dp的代码比数据结构题短到不知道哪里去了,而且1A,爽啊 1 #include <cstdio> 2 int t=1,T,n,m; 3 long long dp[65][100][130]; 4 int main() 5 { 6 for(scanf("%d",&T);t

JavaBean与EJB有何不同uuwc58AA

如果说互联网解决信息不对称,移动互联网解决沟通不及时,那么区块链解决的是信任难建立和价值难共享.比特币3.0时代已经到来,3.0时代意味着"随处可用的区块链".如何实现随处可用?吴萌野老师认为,一是基础链,二是中间件.有关基础链的技术问题和解决方案,吴萌野老师给出的答案是从计算层的改进方向:一是采用更快速的智能合约容器和运行时,并优化共识节点规模.谈到中间件,他希望通过中间件搭建连接互联网云服务和区块链智能合约的中间桥梁,推动区块链应用生态规模化落地. 吴萌野1999年毕业于是清华大学

树形DP习题

听闻noip要考树形DP,本蒟蒻万分惶恐,特刷一坨题目,以慰受惊之心. codevs 1486 /*和非常出名的"选课"是一个题*/ #include<cstdio> #include<iostream> #include<cstring> #define N 1010 using namespace std; int son[N][2],f[N][N],v[N],n,m,flag; int dfs(int x,int y) { if(f[x][y]

习题:烽火传递(DP+单调队列)

烽火传递[题目描述]烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情.在某两座城市之间有n个烽火台,每个烽火台发出信号都有一定的代价.为了使情报准确的传递,在m个烽火台中至少要有一个发出信号.现输入n.m和每个烽火台发出的信号的代价,请计算总共最少需要花费多少代价,才能使敌军来袭之时,情报能在这两座城市之间准确的传递!!![输入描述]第一行有两个数n,m(1<=n,m<=1000000)分别表示n个烽火台

习题:小奇探险(单调队列 &amp; dp)

题目 小奇去遗迹探险,遗迹里有 $N$ 个宝箱,有的装满了珠宝,有的装着废品. 小奇有地图,所以它知道每一个宝箱的价值,但是它不喜欢走回头路,所以要按顺序拿这 $N$ 个宝箱中的若干个. 拿宝箱很累的.一开始小奇的体力是 $1$,每得到一个宝箱之后,小奇得到的价值是体力 $\times$ 宝箱的价值,之后它的体力就会变为原来的 $k$ 倍 $(0<k<1)$. 小奇不喜欢连续放过很多宝箱,所以任意一段长度为 $M$ 的序列中,小奇一定要取走其中的一个宝箱. 现在小奇想知道它能得到的最大价值和.

习题:宝牌一大堆(DP&amp;卡常)

题目 传送门 思路 这道题主要是状态不好想和题目不好理解 如果你和笔者一样没有接触过麻将 我们首先将整个麻将进行hash处理 定义\(dp_{i,j,k,l,m,n}\)为前i种牌,杠子和面子总共的数量为j,雀子的数量为k,第\(i-2\)种牌的数量为l,第\(i-1\)种牌的数量为m,第种i牌的数量为n 需要特别注意的是,DP的值是不将i-2~i这三种牌考虑进去的 那么可以写出转移 \(\begin{cases}dp_{i,j+1,k,l+1,m+1,n+1}(\mbox{顺子})\\dp_{

习题:寿司晚宴(状压DP)

题目 传送门 思路 比较恶心的一道状压 如果你一开始就看最大范围, 你的心中可能一点想法都没有 但是如果你从最小的数据开始看 也就是\(n\le 30\) 如果你对质数足够熟悉的话 那么你会发现30以内的质数是10 还有一点,题目中对不和谐度的描述最关键的一点是互质 这说明了什么? 30分的思路时间复杂度极可能为\(O(n*2^n*2^n)\) 也就是状压,\(2^n\)的意义就为在二进制下,第i个质数是否出现 之后我们就可以很简单的统计出来. 很显然这个做法是可以推广的 我们依然是存一个二进制

习题:排兵布阵(DP)

题目 传送门 思路 背包板子题 代码 #include<iostream> #include<algorithm> #include<vector> using namespace std; int s,n,m; int maxx; vector<int> v[105]; int dp[105][20005];//前i个城堡总共用了j的兵力,最终能收获的最大成果 int main() { cin>>s>>n>>m; for