您的位置:首页 > 其它

POJ 3298 递推,DP

2011-01-14 23:55 344 查看
Antimonotonicity

Time Limit: 2000MSMemory Limit: 65536K
Total Submissions: 2428Accepted: 995
Description

I have a sequence Fred of length n comprised of integers between 1 and n inclusive. The elements of Fred are pairwise distinct. I want to find a subsequence Mary of Fred that is as long as possible and has the property that:

Mary0 > Mary1 < Mary2 > Mary3 < ...

Input

The first line of input will contain a single integer T expressed in decimal with no leading zeroes. T will be at most 50. T test cases will follow.

Each test case is contained on a single line. A line describing a test case is formatted as follows:

n Fred0 Fred1 Fred2 ... Fredn-1.

where n and each element of Fred is an integer expressed in decimal with no leading zeroes. No line will have leading or trailing whitespace, and two adjacent integers on the same line will be separated by a single space. n will be at most 30000.

Output
For each test case, output a single integer followed by a newline --- the length of the longest subsequence Mary of Fred with the desired properties.
Sample Input
4
5 1 2 3 4 5
5 5 4 3 2 1
5 5 1 4 2 3
5 2 4 1 3 5

Sample Output
1
2
5
3

Source
Waterloo Local Contest, 2007.7.14
利用凹凸函数,依次递推。。
Source Code
Problem: 3298User: bingshen
Memory: 252KTime: 172MS
Language: C++Result: Accepted
Source Code
#include<stdio.h>
#include<string.h>

int a[30005];

int main()
{
int i,t,n,m,ans;
bool s;
scanf("%d",&t);
while(t--)
{
ans=1;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
m=a[1];
s=true;
for(i=2;i<=n;i++)
{
if(m<a[i]&&s)
m=a[i];
else if(m>a[i]&&!s)
m=a[i];
else if(m>a[i]&&s)
{
m=a[i];
s=false;
ans++;
}
else if(m<a[i]&&!s)
{
m=a[i];
s=true;
ans++;
}
}
printf("%d/n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: