ACM PKU 1887 Testing the CATCHER 最长下降(上升)子序列 一维动态规划

ACM PKU 1887 Testing the CATCHER 最长下降(上升)子序列 一维动态规划

http://acm.pku.edu.cn/JudgeOnline/problem?id=1887
题目太罗嗦了,简单的说就是求最长下降子序列;
这是一通用题,还有最长上升子序列,都是一样的解法.
状态转移方程:
Max(1)=1;
Max( i )=Max{ Max(j):  1<=j<i && a[i]<a[j]   }+1;
二十分钟AC,下面是源代码

Source Code

Problem: 
1887   User: lnmm 
Memory: 372K  Time: 78MS 
Language: C
++   Result: Accepted 

Source Code 
#include
" stdio.h "
void  main()
{
    
int i,j,tempMax;
    
int nCase=1;
    
int a[32767];
    
int totalMax[32767];
    
int temp;
    
while(scanf("%d",&temp))
    
{
        
if(temp==-1)break;
        a[
1]=temp;
        totalMax[
1]=1;
        
for(i=1;;)
        
{
            scanf(
"%d",&temp);
            
if(temp==-1)break;
            
else
            
{
                a[
++i]=temp;
                tempMax
=0;             //找到i之前 的totalMax[j]最大且a[j]>a[i]的j值
                for(j=1;j<i;j++)
                    
if(a[i]<a[j]&&tempMax<totalMax[j])tempMax=totalMax[j];
                totalMax[i]
=tempMax+1;   //i取的是上面得到的值,加上本身(因为有a[j]>a[i]),所以+1
            }

        }

        temp
=0;
        
for(j=1;j<=i;j++)
            
if(totalMax[j]>temp)temp=totalMax[j];
        printf(
"Test #%d:\n",nCase++);
        printf(
"  maximum possible interceptions: %d\n\n",temp);



    }

}

你可能感兴趣的:(ACM PKU 1887 Testing the CATCHER 最长下降(上升)子序列 一维动态规划)