首页 > 其他分享 >codeforces 4D D. Mysterious Present(dp)

codeforces 4D D. Mysterious Present(dp)

时间:2023-04-23 21:39:08浏览次数:43  
标签:题目 temp int MAX Mysterious 4D include dp


题目连接:

codeforces 4D


题目大意:

给出n个信封,这n个信封有长和宽,给出卡片的尺寸,求取能够装入卡片的最长的序列,序列满足后一个的长和宽一定大于前一个,求最长的这个序列的长度,并且给出一组可行解。


题目分析:

  • 一看这种题目就是dp的题目,状态定义dp[i]为以i结尾的序列的最大的长度,并且利用一个数组记录得到最优解的路径,采取链表的形式进行存储。
  • 首先对给出的信封进行排序,按照宽为第一关键字,高为第二关键字,
  • 状态转移方程如下: dp[i]=maxj=0j−1{dp[j]+1},{a[j].w<a[i].w && a[j].h<a[i].h}
  • 答案递归地倒序输出即可。

AC代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define MAX 5007

using namespace std;

int n,w,h;
int dp[MAX];
int back[MAX];

struct Node
{
    int w,h,x;
    bool operator < ( const Node & a ) const
    {
        if ( w == a.w ) return h < a.h;
        return w < a.w;
    }
}a[MAX];

void print ( int x )
{
    if ( a[x]. w <= w || a[x].h <= h ) return;
    print ( back[x] );
    printf ( "%d " , a[x].x );
}

int main ( )
{
    while ( ~scanf ( "%d%d%d" , &n , &w , &h ))
    {
        for ( int i = 1 ; i <= n ; i++ )
        {
            scanf ( "%d%d" , &a[i].w , &a[i].h );
            a[i].x = i;
        }
        dp[0] = -1;
        sort ( a+1 , a+n+1 );
        for ( int i = 1 ; i <= n ; i++ )
        {
            int temp = -1,id = 0;
            for ( int j = 0 ; j < i ; j++ )
                if ( a[j].w < a[i].w && a[j].h < a[i].h && a[j].w > w && a[j].h > h )
                    if ( temp < dp[j] )
                    {
                        temp = dp[j];
                        id = j;
                    }
            if ( a[i].w > w && a[i].h > h ) dp[i] = 1 , back[i] = 0;
            else dp[i] = -1;
            if ( temp+1 > dp[i] )
            {
                dp[i] = temp+1;
                back[i] = id;
            }
        }
        int maxn = 0;
        for ( int i = 1 ; i <= n ; i++ )
            maxn = max ( maxn , dp[i] );
        if ( maxn == 0 )
        {
            puts ( "0" );
            continue;
        }
        printf ( "%d\n" , maxn );
        for ( int i = 1 ; i <= n ; i++ )
            if ( maxn == dp[i] )
            {
                print ( i );
                puts ("");
                break;
            }
    }
}


标签:题目,temp,int,MAX,Mysterious,4D,include,dp
From: https://blog.51cto.com/u_7936627/6218740

相关文章

  • codeforces 2B B. The least round way(dp+数论)
    题目链接:codeforces2B题目大意:给出一个n*n的矩阵,从左上角走到右下角,只能向右或向下走,问路径上的数之积末尾0最少的方案是什么。题目分析:首先我们要做两个预处理,处理出每个位置上的数包含多少个2的质因子和多少个5这个质因子然后我们统计路径上弄到最少的2的方案数和最少的5的方案......
  • codeforces 126B B. Password(kmp+dp)
    题目链接:codeforces126B题目大意:给出一个字符串,找出一个子串既是它的前缀,也是它的后缀,还是一个非后缀也非前缀的子串。题目分析:本来挺简单的一个题,最开始想复杂了,还用了后缀数组,醉了。这个题主要用的是kmp的next数组,首先我们要了解next数组的定义,next[i]表示以i为末尾的子串的后缀......
  • codeforces 118D D. Caesar's Legions(dp)
    题目链接:codeforces118D题目大意:给出n1个1,n2个2,给出k1和k2代表连续的1和2的最大长度,问能够构造的合法的不同串的数量。题目分析:能够递推,所以想到能够利用dp做。首先我们定义状态,dp[i][j][k][2]代表以1或2结尾,结尾相同的元素的数量为k,1的总数是j的当前序列长度为i的串的数量。首先......
  • codeforces 264B B. Good Sequences(dp+数论)
    题目链接:codeforces264B题目大意:给出n个数,利用这n个数构造一个好的序列,好的序列是单调增的,而且序列中相邻的两个元素都不互质,问最长的好序列的长度是多少。题目分析:首先我们定义状态dp[i]表示当前的数进行构造的序列末尾的数的质因数包含i的时候的最长的情况。然后我们从小到大枚......
  • codeforces 159D D. Palindrome pairs( manacher+dp )
    题目链接:codeforces159D题目大意:给出一个字符出,求取这个字符串中互相不覆盖的两个回文子串的对数。题目分析:首先能够用manacher模板,因为这个算法处理的字符串的长度式奇数,所以我们首先将原字符串拓展,也就是用一个没有出现过的子串填充到每两个字符之间,首位也要添加,这样处理后得到......
  • codeforces 414B B. Mashmokh and ACM(dp)
    题目链接:codeforces414B题目大意:定义一个序列,前一项能够整除后一项,给定这个序列中数的取值范围和序列的长度,问有多少种构造方法。题目分析:我们定义状态dp[i][j]为前i项已经确定且第i项为j的方案数。转移方程dp[i][j]=∑k|jdp[i−1][k]复杂度O(n⋅k)AC代码:#include<iostream>......
  • codeforces 573B B. Bear and Blocks(线段树+dp)
    题目链接:codeforces573B题目大意:给出n个连续塔,每个塔有高度hi,每次取走最外层的块,问需要多少次操作能够拿光所有的块。题目分析:首先我们可以知道第一次操作时,对于每个塔的变化满足如下的公式:hi=min(hi−1,hi−1,hi+1)每次操作都满足如下的递推式,我们递推一下得到第k次操作第i......
  • 插头dp
    插头dp是什么,这里只有插头在状态压缩动态规划中,有一类是需要记录若干个元素的联通情况,称之为基于连通性状态压缩的动态规划,也就是插头dp在大部分棋盘状压dp中,状态划分可以依据行或列进行划分,行列之间相对独立,但有时却不行,例如让你在棋盘中对联通块进行操作,下图的联通块是无......
  • m基于BP译码算法的QC-LDPC误码率matlab仿真,对比不同译码迭代次数的误码率性能
    1.算法仿真效果matlab2022a仿真结果如下: 2.算法涉及理论知识概要       LDPC码是麻省理工学院RobertGallager于1963年在博士论文中提出的一种具有稀疏校验矩阵的分组纠错码。几乎适用于所有的信道,因此成为编码界近年来的研究热点。它的性能逼近香农极限,且描述和实现......
  • m基于BP译码算法的QC-LDPC误码率matlab仿真,对比不同译码迭代次数的误码率性能
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要LDPC码是麻省理工学院RobertGallager于1963年在博士论文中提出的一种具有稀疏校验矩阵的分组纠错码。几乎适用于所有的信道,因此成为编码界近年来的研究热点。它的性能逼近香农极限,且描述和实现简单,易于进行理论分......