Luogu P1103 书本整理
Posted soledadstar
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Luogu P1103 书本整理相关的知识,希望对你有一定的参考价值。
题目大意:有n个二元组,先按第一关键字排序,定义价值为每相邻两个元素第二关键字差的绝对值和。现在去掉k个二元组,请你求出最小的价值。
第一关键字至于排序有关,排完序后完全可以不要。
与其考虑去掉k个二元组,不如保留n-k个二元组。
设f[i][j]为前i个二元组保留j个的最小代价(必须含i),则前i-1个二元组中保留j-1个,枚举转移点t,得到状态转移方程:
f[i][j]=minf[t][j-1](j-1≤t<i)
初始化:f[i][1]=0
答案minf[i][k](k≤i≤n)
DP的代码一般不需要注释
#include<iostream> #include<iomanip> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> #include<map> using namespace std; #define INF 0x3f3f3f3f inline int read() char ch; bool bj=0; while(!isdigit(ch=getchar())) bj|=(ch==‘-‘); int res=ch^(3<<4); while(isdigit(ch=getchar())) res=(res<<1)+(res<<3)+(ch^(3<<4)); return bj?-res:res; void printnum(int x) if(x>9)printnum(x/10); putchar(x%10+‘0‘); inline void print(int x,char ch) if(x<0) putchar(‘-‘); x=-x; printnum(x); putchar(ch); int n,k; struct node int h,w; inline bool operator < (node x)const return h<x.h; a[105]; int f[105][105]; int ans=0x3f3f3f3f; signed main() n=read(); k=n-read(); for(int i=1; i<=n; i++) a[i].h=read(); a[i].w=read(); sort(a+1,a+n+1); memset(f,0x3f,sizeof(f)); for(int i=1; i<=n; i++)f[i][1]=0; for(int i=2; i<=n; i++) for(int j=2; j<=k; j++) for(int l=j-1; l<i; l++)f[i][j]=min(f[i][j],f[l][j-1]+abs(a[i].w-a[l].w)); for(int i=k; i<=n; i++)ans=min(ans,f[i][k]); print(ans,‘\n‘); return 0;
以上是关于Luogu P1103 书本整理的主要内容,如果未能解决你的问题,请参考以下文章