zoukankan      html  css  js  c++  java
  • 类似最长递增子序,记忆化DP—— Codeforces Beta Round #4 (Div. 2 Only)D Mysterious Present

    题意主要是寻找最长递增子序,每个元素有两个属性,H,W,下一个一定要比上一个的H,W大

    先排序,

    再类似最长递增子序的做法,

    两个for 语句

    注意点:就是每个元素H,W要比开始给定的大

    记忆路径的过程就是pre记录法+stack还原

    View Code
    #include<iostream>
    #include
    <algorithm>
    #include
    <stdio.h>
    #include
    <stack>
    using namespace std;

    struct data
    {
    int no;
    int w;
    int h;
    int add;
    int pre;
    }ss[
    59];////

    int cmp(data a,data b)
    {
    if(a.w==b.w)
    return a.h<b.h;
    return a.w<b.w;
    }

    int main ()
    {
    int n,w,h;
    scanf(
    "%d%d%d",&n,&w,&h);

    int i,j;
    for(i=0;i<n;i++)
    {
    scanf(
    "%d%d",&ss[i].w,&ss[i].h);
    if(ss[i].w>w&&ss[i].h>h)
    ss[i].add
    =1;
    else
    ss[i].add
    =0;
    ss[i].pre
    =-1;
    ss[i].no
    =i;
    }

    sort(
    &ss[0],&ss[n],cmp);

    int ri;

    for(i=0;i<n;i++)
    {
    if(ss[i].add>=1)
    {
    for(j=i+1;j<n;j++)
    {
    if(ss[j].add>=1)

    if(ss[i].w<ss[j].w&&ss[i].h<ss[j].h)
    {
    if(ss[j].add<ss[i].add+1)
    {
    ss[j].add
    =ss[i].add+1;
    ss[j].pre
    =i;
    }
    }
    }
    }
    }

    int max=-1,kai;
    for(i=0;i<n;i++)
    {
    if(max<ss[i].add)
    {
    max
    =ss[i].add;
    kai
    =i;
    }
    }

    printf(
    "%d\n",max);
    if(max==0)return 0;

    stack
    <int >st1;
    int point=ss[kai].pre;
    st1.push(ss[kai].no);
    while(point!=-1)
    {
    st1.push(ss[point].no);
    point
    =ss[point].pre;
    }
    while(!st1.empty())
    {
    printf(
    "%d ",st1.top()+1);
    st1.pop();
    }

    printf(
    "\n");
    }

  • 相关阅读:
    JZOJ 2548. 【NOIP2011模拟9.4】最大正方形
    JZOJ 3532. 【NOIP2013提高组day1】转圈游戏
    网络流模板 dinic
    1433: [ZJOI2009]假期的宿舍
    JZOJ 1285. 奶酪厂
    JZOJ 1284. 病毒
    SpringMVC路径匹配规则源码
    RESTful设计风格下SpringMVC的URI设计性能问题
    递归查询mysql数据库设计
    java定时任务调度
  • 原文地址:https://www.cnblogs.com/huhuuu/p/2053770.html
Copyright © 2011-2022 走看看