zoukankan      html  css  js  c++  java
  • 最长不下降代码dp

    我看以前写过一个最长不下降,但是感觉可能没有那么好理解emmmm

    下面这个是从正序寻找的emmmm

    先来一个WA代码,我给写了WA的具体行数,看看其他行其实可以看出它的思路

    第二个代码是AC的

     1 #include <iostream>
     2 #include <string>
     3 #include <string.h>
     4 #include <vector>
     5 using namespace std;
     6 long MAX=1010;
     7 int a[1000];
     8 int maxa[1000];
     9 int pos[1000];
    10 int main() {
    11     int N;
    12     cin >> N;
    13     for (int i = 1; i <= N; ++i) {
    14         cin >> a[i];
    15         maxa[i] = 1;
    16     }
    17     int maxfinal=0;
    18     int final_pos=0;
    19     for (int k = 2; k <= N; ++k) {
    20         for (int i = k-1; i >=1; --i) {
    21             if (a[k] > a[i]) {
    22                 maxa[k] = max(maxa[k], maxa[i] + 1);
    23                 pos[k]=i;//WA典范,因为maxa可能没有取maxa[i]的值,但是pos 一直在改变
    24                 if (maxa[k] > maxfinal) {
    25                     maxfinal = maxa[k];
    26                     final_pos=k;
    27                 }
    28 
    29             }
    30         }
    31     }
    32     cout<<maxfinal<<endl;
    33     for (int l = 1; l < 5; ++l) {
    34         cout<<pos[l]<<endl;
    35 
    36     }
    37     for (int j = final_pos;  ; ) {
    38         if(a[j]==0)
    39             break;
    40         cout<<a[j]<<" ";
    41         j=pos[j];
    42 
    43 
    44     }
    45 
    46 
    47 
    48 }

    没错就是max(,)的下一行,但是如果只需要输出长度的话就把这行给注释掉就行了

     1 #include <iostream>
     2 #include <string>
     3 #include <string.h>
     4 #include <vector>
     5 using namespace std;
     6 long MAX=1010;
     7 int a[1000];
     8 int maxa[1000];
     9 int pos[1000];
    10 int main() {
    11     int N;
    12     cin >> N;
    13     for (int i = 1; i <= N; ++i) {
    14         cin >> a[i];
    15         maxa[i] = 1;
    16     }
    17     int maxfinal=0;
    18     int final_pos=0;
    19     for (int k = 2; k <= N; ++k) {
    20         for (int i = k-1; i >=1; --i) {
    21             int data;
    22             if (a[k] > a[i]) {
    23                 if(maxa[k]<maxa[i] + 1) {
    24                     maxa[k] = maxa[i] + 1;
    25                     pos[k] = i;
    26                     if (maxa[k] > maxfinal) {
    27                         maxfinal = maxa[k];
    28                         final_pos = k;
    29                     }
    30                 }
    31 
    32             }
    33         }
    34     }
    35     cout<<maxfinal<<endl;
    36     for (int j = final_pos;  ; ) {
    37         if(a[j]==0)
    38             break;
    39         cout<<a[j]<<" ";
    40         j=pos[j];
    41 
    42 
    43     }
    44 
    45 
    46 
    47 }

    这个是输出序列的,那个存数方式还算很常用

    还有就是,一维数组比二维要快?我一会儿写一篇来检测一下哈

  • 相关阅读:
    第三十章 货币增长与通货膨胀
    第二十九章 货币制度
    第二十八章 失业
    第二十七章 金融学的基本工具
    第二十六章 储需、投资和金融体系
    第二十五章 生产与增长
    第二十四章 生活费用的衡量
    第二十三章 一国收入的衡量
    第二十二章 微观经济学前沿
    Struts2 文件上传进度条的实现
  • 原文地址:https://www.cnblogs.com/zhmlzhml/p/13376701.html
Copyright © 2011-2022 走看看