hdu 4512 DP

来源:互联网 发布:大芒果数据库 编辑:程序博客网 时间:2024/06/11 23:21

dp【i】【j】表示从1到i 从j到N并且以i为前半段的最右的最长的回文序列的最大长度

当num【i】== num【j】 dp【i】【j】 = max( dp【k】【j+1】) + 1;

当num【i】!= num【j】 dp【i】【j】 = dp【i】【j+1】;

AC代码如下:

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;int dp[220][220];int num[220], N;int main(){    int T;    scanf( "%d", &T );    while( T-- ){        scanf( "%d", &N );        for( int i = 1; i <= N; i++ ){            scanf( "%d", &num[i] );        }      //  if( N == 1 ){    //        printf( "1\n" );    //        continue;   //     }        memset( dp, 0, sizeof( dp ) );        int ans = 0;        for( int i = 1; i <= N; i++ ){            for( int j = N; j > i; j-- ){                if( num[i] == num[j] ){                    int temp = 0;                    for( int k = 1; k < i; k++ ){                        if( num[k] < num[i] ){                            temp = max( temp, dp[k][j+1] );                        }                    }                    dp[i][j] = temp + 1;                }else{                    dp[i][j] = dp[i][j+1];                }                int flag = 0;                for( int k = i + 1; k < j; k++ ){                    if( num[k] > num[i] ){                        flag = 1;                        break;                    }                }                ans = max( ans, dp[i][j] * 2 + flag );            }        }        printf( "%d\n", ans );    }    return 0;}


0 0