题目链接:http://www.rqnoj.cn/Problem_217.html
第一问为最长不下降子序列,比较好做,主要是第二问,这里我用多个栈来维护,对于每个栈,栈中元素必须满足以不上升的形式加入,那么遇到一个元素,则要么放进已有的栈中,要么新创建一个栈来维护以这个元素开头的不下降子序列。
代码如下:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
using namespace std;
const int maxn = 1005 ;
int num[maxn] ;
int ans[maxn] ;
stack<int> s[maxn] ;
int m ;
int n ;
void work() ;
void dp() ;
void res() ;
int main()
{
//freopen("a4.in" , "r" , stdin) ;
work() ;
return 0;
}
void work()
{
int i ;
scanf("%d" , &m) ;
for(i = 0 ; i < m ;i ++)
{
scanf("%d" , &num[i]) ;
}
dp() ;
res() ;
int max_len ;
max_len = 0 ;
for(i = 0 ; i < m ; i ++)
if(max_len < ans[i])
max_len = ans[i] ;
printf("%d %d\n" , max_len , n) ;
}
void dp()
{
int i ;
int j ;
int k ;
memset(ans , 0 , sizeof(ans)) ;
for(i = 0 ; i < m ; i ++)
{
k = 0 ;
for(j = 0 ; j < i ; j ++)
{
if(ans[j] > k && num[j] >= num[i])
{
k = ans[j] ;
}
}
ans[i] = k + 1 ;
}
}
void res()
{
int i ;
int j ;
s[0].push(num[0]) ;
n = 1 ;
for(i = 1 ; i < m ; i ++)
{
for(j = 0 ; j < n ; j ++)
{
if(num[i] <= s[j].top())
{
s[j].push(num[i]) ;
break ;
}
}
if(j==n)
{
s[n].push(num[i]) ;
n++ ;
}
}
}