sequence
Time Limit:1000MS Memory Limit:65536K
Description
将一个给定的数列,拆分成K个不降序列,每个数出现且只出现一次,且在各序列中各个数相对原数列的相对顺序不变。如7 6 9 8 10 可以拆分7 9 10和6 8。求最小的K值。
Input
第一行输入一个整数T(1<=T<=100),表示接下来T组测试数据,每组两行,第一行为n,代表数列长度(1<=n<=10000)接下来一行有n个数,空格分隔(每个数<=50000)
Output
对每组数据输出一个最小值的K值。
Sample input
2
5
7 6 9 8 10
5
5 4 3 2 1
Sample output
2
5
贪心
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int height[10000];
int main()
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
int x;
int index=0;
while(n--)
{
scanf("%d",&x);
int t_index=-1;
for(int i=0;i<index;i++)
{
if(x>=height[i]&&(t_index==-1||height[t_index]<height[i]))
{
t_index=i;
}
}
if(t_index==-1)
{
height[index]=x;
index++;
}
else
{
height[t_index]=x;
}
}
printf("%d\n",index);
}
return 0;
}
其实这道题和最少拦截系统都是一类的题
这个代码,是我把最小拦截系统的代码,改了改
至于效果和上面的那个比怎么样,我还没测,总之
万变不离其中
#include<stdio.h>
#include<iostream>
#include<string.h>
const int inf=99999999;
using namespace std;
int dp[10000];
int main()
{
int n,x,i,res,flag;
int t;
cin>>t;
while(t--)
{
scanf("%d",&n);
res=0;
while(n--)
{
scanf("%d",&x);
flag=0;
//min=inf;
int max=0;
int temp;
for(i=0;i<res;i++)
{
if(x>=dp[i]&&max<x-dp[i])
{
max=dp[i]-x;
temp=i;
flag=1;
}
}
if(flag==0)
{
dp[res]=x;
res++;
}
else
{
dp[temp]=x;
}
}
printf("%d\n",res);
}
return 0;
}