zoukankan      html  css  js  c++  java
  • CSU 1225 最长上升子序列并记录其个数

     1 for(int j=0;j<i;j++){
     2                 if(h[i] > h[j]){
     3                     if(len[i] == len[j] + 1) cnt[i]+=cnt[j];
     4                     if(len[i] < len[j] + 1) len[i] = len[j] + 1 , cnt[i] = cnt[j];
     5                 }
     6                 //身高相同的情况统计
     7             /*else if(h[i] == h[j]){
     8                     if(len[i] == len[j]) cnt[i] += cnt[j];
     9                     if(len[i] < len[j]) len[i] = len[j] , cnt[i] = cnt[j];
    10                 }*/
    11             }        

    这道题需要注意的一点是如果出现身高相同的情况,那么这两个人不管谁站在队列中只算一种情况:如上面的代码所示,如果相同也统计那么就会报错,但是样例因为没有相同高度所以可以过

    len[i] 表示前i个对象能构建的最长的子序列长度

    cnt[i] 表示前i个对象构建的最长子序列长度的个数

     1 #include <cstdio>
     2 #include <cstring>
     3 using namespace std;
     4 #define max(a,b) a>b?a:b
     5 const int N = 1005;
     6 int h[N] , len[N] , cnt[N];
     7 int main()
     8 {
     9     freopen("test.in","rb",stdin);
    10     int n;
    11     while(scanf("%d",&n)!=EOF){
    12         memset(len , 0 ,sizeof(len));
    13         memset(cnt , 0 ,sizeof(cnt));
    14         len[0] = 1 , cnt[0] = 1;
    15         for(int i = 0;i < n;i++)
    16         {
    17             len[i] = cnt[i] = 1;
    18             scanf("%d",h+i);
    19             for(int j=0;j<i;j++){
    20                 if(h[i] > h[j]){
    21                     if(len[i] == len[j] + 1) cnt[i]+=cnt[j];
    22                     if(len[i] < len[j] + 1) len[i] = len[j] + 1 , cnt[i] = cnt[j];
    23                 }
    24                 /*else if(h[i] == h[j]){
    25                     if(len[i] == len[j]) cnt[i] += cnt[j];
    26                     if(len[i] < len[j]) len[i] = len[j] , cnt[i] = cnt[j];
    27                 }*/
    28             }
    29         }
    30         int max_len = 0 , cnt_all = 0;
    31         for(int i=0;i<n;i++){
    32             max_len = max(max_len , len[i]);
    33         }
    34         for(int i=0;i<n;i++){
    35             if(max_len == len[i])
    36                 cnt_all += cnt[i];
    37         }
    38         printf("%d %d
    ",max_len,cnt_all);
    39     }
    40     return 0;
    41 }
  • 相关阅读:
    遗传算法的理解
    使用Grub Rescue 修复MBR
    java 虚拟机与并发处理几个问题简要(二)
    java 虚拟机与并发处理几个问题简要(一)
    Fence Repair POJ
    Best Cow Line---POJ 3617(贪心)
    迷宫的最短路径
    最大子段和
    Lake Counting --POJ 2386
    Ants POJ
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/4045516.html
Copyright © 2011-2022 走看看