poj 1836 Alignment

一道简单dp题,自己感觉这类dp题都很简单,只要找到一种状态,从小往大了推就行了,可关键是木读懂题啊。。。。。。开始读的时候,没认真理解where each soldier can see by looking lengthwise the line at least one of the line's extremity (left or right)这句话,结果理解成从一个用n个元素的数组中抽出几个数,使数组非递减或非递增排列,呃~自然WA的很惨,然后,看了题解,发现我错了,它是让找一个先上升在下降的最长序列,于是开始做,呃~有WA,因为漏掉了一种情况,1 , 2 , 3 , 4 , 1 , 1 , 4 , 3 , 2 , 1 ,这种情况下是应该把中间那两个1去掉才是最长序列,所以又改,终于看见AC了,啊,激动啊~

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <queue>
#define maxm 1003
#define exp 1e-6
using namespace std ;

int dpl[maxm] , dpr[maxm] ;
double h[maxm] ;

int max ( int x , int y )
{
    return x > y ? x : y ;
}

int main()
{
    int i , j , n ;

    while ( scanf ( "%d" , &n ) != EOF )
    {
        for ( i = 1 ; i <= n ; i++ )
        {
            scanf ( "%lf" , &h[i] );
            dpl[i] = 1 ;
            dpr[i] = 1 ;
        }
        int maxx = -1 ;
        for ( i = 1 ; i <= n ; i++ )
        {
            for ( j = i - 1; j > 0 ; j-- )
            {
                if ( ( h[i] - h[j] ) >= exp )
                dpl[i] = max ( dpl[i] , dpl[j] + 1 );
            }
        }
        for ( i = n - 1 ; i > 0 ; i-- )
        {
            for ( j = n ; j > i ; j-- )
            if ( ( h[i] - h[j] ) >= exp )
            dpr[i] = max ( dpr[i] , dpr[j] + 1 );
        }
        for ( i = 1 ; i < n ; i++ )
        for ( j = i + 1 ; j <= n ; j++ )
        if ( dpl[i] + dpr[j] > maxx )
        maxx = dpl[i] +dpr[j] ;
        for ( i = 1 ; i <= n ; i++ )
        if ( dpl[i] + dpr[i] -1 > maxx )
        maxx = dpl[i] + dpr[j] - 1;
        printf ( "%d\n" , n - maxx );
    }
    return 0;
}
原文地址:https://www.cnblogs.com/misty1/p/2543843.html