poj 3298 Antimonotonicity DP

 

小菜菜说下这道题,因为15分钟搞定的,而且一次A了。

题意就是求最长的符合那个条件的序列,当然,不一定连续。

 

首先,如果没有任何符合条件的情况出现,那么最长的就是每个元素本身,长度为1。

 

思路:先说个概念,大元素:大于前面的,大于后面的。

从2出发,1是大元素。如果大元素遇见比它本身大的,则最大解不变,遇见的这个元素仍为大元素,如果遇见比它小的元素,则最大解+1,遇见的这个元素成小元素,下一个就考虑遇见的这个元素;

同样,如果是小元素遇见比它小的,则最优解长度不变,遇见的这个元素仍为小元素,如果是遇见比它大的,则最优解+1,遇见的这个元素为大元素,下一个就考虑遇见的这个元素;

 

我弄了这么个, int dp[30005][4];  dp[i][0]==1代表当前的第i个元素是作为大元素在序列中的(<i >),dp[i][0]==0代表当前的第i个元素是作为小元素在序列中的(>i <);dp[i][1]就是考虑前i个元素的的最大解。

 如果有幸被牛人看见的话请不吝指教哈~

 

代码挺菜的。

#include "stdio.h"
#include "iostream"
using namespace std;
int main()
{
    int m,n,i,j,w,t;
    int a[30005];
    int dp[30005][4];
    while(scanf("%d",&t)!=EOF)
    {
        while(t--)
        {
            scanf("%d",&n);
            for(i=1; i<=n; i++)
                scanf("%d",&a[i]), dp[i][1]=1, dp[i][2]=a[i];

            dp[1][0] = 1;
            if(a[1] > a[2])
            {
                  dp[2][1]=2, dp[2][2]=a[2];
            }

            for(i=2; i<=n; i++)
            {
                if(dp[i-1][0])
                {
                    if(a[i] < dp[i-1][2])
                    {
                        dp[i][0]=0;  dp[i][1]=dp[i-1][1]+1;
                    }
                    else
                    {
                        dp[i][0]=dp[i-1][0];  dp[i][1]=dp[i-1][1];
                    }
                    dp[i][2]=a[i];
                }
                else
                {
                    if(a[i] > dp[i-1][2])
                    {
                        dp[i][0]=1;  dp[i][1]=dp[i-1][1]+1;
                    }
                    else
                    {
                        dp[i][0]=dp[i-1][0];  dp[i][1]=dp[i-1][1];
                    }
                    dp[i][2]=a[i];
                }
            }
            printf("%d\n",dp[n][1]);
        }//t--
    }
    return 0;
}
//752K 172MS


 

752K  172MS

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值