zoukankan      html  css  js  c++  java
  • wenbao与最大上升子序列2

    最大不下降子序列

    poj 1609

    http://poj.org/problem?id=1609

    求可以垒的最高瓷砖,凸巢,凹巢(左右两边)

    利用最大上升子序列

     1 #include <iostream>
     2 #include <string.h>
     3 #include <algorithm>
     4 using namespace std;
     5 const int maxn = 1e4+10;
     6 int dp[maxn];
     7 int main(){
     8     int n;
     9     while(cin>>n){
    10         if(n == 0) {
    11             cout<<"*"<<endl;
    12             break;
    13         }
    14         else{
    15             pair<int, int> p[maxn];
    16             memset(dp, 0, sizeof(dp));
    17             for(int i = 0; i < n; i++){
    18                 cin>>p[i].first>>p[i].second;
    19                 dp[i] = 1;
    20             }
    21             sort(p, p+n);
    22             int ma = 1;
    23             for(int i = 1; i < n; i++){
    24                 for(int j = 0; j < i; j++){
    25                     if(dp[i] < dp[j]+1 && p[i].first >= p[j].first && p[i].second >= p[j].second){
    26                         dp[i] = dp[j] + 1;
    27                     }
    28                     if(dp[i] > ma) ma = dp[i];
    29                 }
    30             }
    31             cout<<ma<<endl;
    32         }
    33     }
    34 }

    二维dp

     1 #include <iostream>
     2 #include <string.h>
     3 #include <algorithm>
     4 using namespace std;
     5 const int maxn = 1e4+10;
     6 int dp[110][110], num[110][110];
     7 int main(){
     8     int n, a, b;
     9     while(cin>>n){
    10         if(n == 0) {
    11             cout<<"*"<<endl;
    12             break;
    13         }
    14         else{
    15             memset(dp, 0, sizeof(dp));
    16             memset(num, 0, sizeof(num));
    17             for(int i = 0; i < n; i++){
    18                 cin>>a>>b;
    19                 num[a][b]++;
    20             }
    21             for(int i = 1; i < 105; i++){
    22                 for(int j = 1; j < 105; j++){
    23                     dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + num[i][j];
    24                 }
    25                 //cout<<dp[i][102]<<"______________"<<endl;
    26             }
    27             cout<<dp[102][102]<<endl;
    28         }
    29     }
    30 }

    只有不断学习才能进步!

  • 相关阅读:
    !ps之前一次执行的内容
    shortcut switch in terminal start pos & end pos
    百度词典搜索_dress code
    修杰楷_百度百科
    红米让夏新没活路了,
    绝杀600元以下智能手机的夏新小V二代-专栏-速途网
    李宗瑞_百度百科
    监制_百度百科
    文件上传~Uploadify上传控件
    知方可补不足~CSS中的几个伪元素
  • 原文地址:https://www.cnblogs.com/wenbao/p/5831256.html
Copyright © 2011-2022 走看看