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 书本整理的主要内容,如果未能解决你的问题,请参考以下文章

P1103 书本整理

洛谷 P1103 书本整理(动规)

动态规划 洛谷P1103 书本整理

P1103 书本整理(DP)

P1103 书本整理

P1103 书本整理