标签:des style blog class c code
| Time Limit: 1000MS | Memory Limit: 30000K | |
| Total Submissions: 12571 | Accepted: 4021 |
Description
Input
Output
Sample Input
8 1.86 1.86 1.30621 2 1.4 1 1.97 2.2
Sample Output
4
求一列数从中间到两端严格递减的最长数目。
分别求出这列数从左到右和从右到左的最长递增子序列。
然后得到从中间到两端递减的最长序列。
#include"stdio.h"
#include"string.h"
#define mmax(a,b) (a>b?a:b)
#define N 1050
int l[N],r[N],dp[N];
double a[N];
int main()
{
int i,j,n;
while(scanf("%d",&n)!=-1)
{
for(i=0;i<n;i++)
{
scanf("%lf",&a[i]);
}
if(n<=2)
{
printf("0\n");
continue;
}
memset(dp,0,sizeof(dp));
memset(l,0,sizeof(l)); //从左到右递增
memset(r,0,sizeof(r)); //从右到左递增
l[0]=r[n-1]=1;
int ans=1,num;
for(i=0;i<n;i++)
{
num=0;
for(j=0;j<i;j++)
{
if(a[j]<a[i]&&l[j]>num)
{
num=l[j];
}
}
l[i]=num+1;
}
for(i=n-1;i>=0;i--)
{
num=0;
for(j=n-1;j>i;j--)
{
if(a[j]<a[i]&&r[j]>num)
{
num=r[j];
}
}
r[i]=num+1;
}
ans=0;
for(i=0;i<n;i++)
{
for(j=n-1,num=0;j>i;j--)
{
if(a[j]<=a[i]&&r[j]>num)
{
num=r[j];
}
}
dp[i]=l[i]+num;
ans=mmax(ans,dp[i]);
}
printf("%d\n",n-ans);
}
return 0;
}
poj 1836 Alignment,布布扣,bubuko.com
标签:des style blog class c code
原文地址:http://blog.csdn.net/u011721440/article/details/26374113