首页 > 代码库 > CSU 1225 最长上升子序列并记录其个数

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\n",max_len,cnt_all);39     }40     return 0;41 }

 

CSU 1225 最长上升子序列并记录其个数