Description |
小乐乐刚装完化妆品,突然大地摇晃,藏宝洞开始崩塌。小乐乐连忙往外跑,可原本的洞口居然出现了一条河!还好,河面上有一排高低不一的木桩,每个木桩上有一只地鼠。当踩了一个高度的木桩后,高度小于等于它的木桩和它左边的木桩都会全部崩塌。小乐乐看见地鼠十分生气,因为反应并不迅捷的她,每每玩打地鼠的游戏时,总有一种被地鼠玩弄的感觉(一个都没打到……啊哈哈哈哈哈……)。所以小乐乐想踩尽量多的地鼠,以解心头之挫败感……现在小乐乐想知道,她最多能踩扁几只地鼠? |
Input |
第一行输入一个n(n<1000) 之后一行有n个数,表示木桩的高度 |
Output |
输出小乐乐最多能踩扁的地鼠的个数 |
Sample Input |
7 1 7 3 5 9 4 8 |
Sample Output |
4 |
最大上升子序列。。。。
1.二分法
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=20002;
int a[N];
int b[N];
int dp(int n)
{
memset(b,0x3f,sizeof(b));
b[0] = a[0];
int len = 1;
for (int i=1; i<n; i++) {
int l = 0;
int r = len;
while (l < r) {
int m = (l+r)>>1;
if (b[m] < a[i]) {
l = m+1;
} else {
r = m;
}
}
b[l] = a[i];
if (l >= len) {
len++;
}
}
return len;
}
int main()
{
int n;
while (cin >> n) {
for (int i=0; i<n; i++) {
cin >> a[i];
}
cout << dp(n) << endl;
}
return 0;
}
2.DP思想
#include<stdio.h>
#include<string.h>
#include<stack>
#include<vector>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
using namespace std;
//memset(b,0,sizeof(b));
// memset(a,0,sizeof(a));
int main()
{
int d[1004],cnt[1004];
int n;
while(cin>>n)
{
memset(cnt,0,sizeof(cnt));
for(int m=0; m<n; m++)
{
cin>>cnt[m];
}
for(int k=0; k<=1004; k++)
{
d[k]=1;
}
for(int i=1; i<n; i++)
{
for(int j=0; j<i; j++)
{
if(cnt[j]<cnt[i]&&d[j]+1>=d[i])
d[i]=d[j]+1;
}
}
sort(d,d+n);
cout<<d[n-1]<<endl;
}
return 0;
}