CodeForces 447C DZY Loves Sequences DP

题目:click here

题意:求给定序列更改其中一个元素后的最长连续上升子序列的长度

分析:最长的连续子序列有2种,一种是严格上升(没有更改元素)的长度加1,一种是两段严格上升的加起来。

 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define F first
 4 #define S second
 5 #define pb push_back
 6 #define power(a) ((a)*(a))
 7 #define ENTER printf("\n");
 8 typedef unsigned long long ll;
 9 const int INF = 0x3f3f3f3f;
10 const double EPS = 1e-8;
11 const int M = 1e5+5;
12 
13 int n, ret;
14 int a[M]; 
15 int dps[M];     // dps[i]保存以i开头的最长连续上升子序列
16 int dpe[M];     // dpe[i]保存以i结束的最长连续上升子序列
17 void solve()    {
18     ret = dpe[0] = dps[n-1] = 1;
19     for( int i=1; i<n; i++ )
20         if( a[i] > a[i-1] ) dpe[i] = dpe[i-1] + 1;
21         else dpe[i] = 1;
22     for( int i=n-2; i>=0; i-- )
23         if( a[i] < a[i+1] ) dps[i] = dps[i+1] + 1;
24         else dps[i] = 1;
25     for( int i=0; i<n; i++ )
26         if( a[i+1]-a[i-1] >= 2 ) ret = max( ret, dps[i+1]+dpe[i-1]+1 );
27         else ret = max( ret, max( dps[i+1]+1, dpe[i-1]+1 ) );
28     printf("%d\n", ret);
29 }
30 
31 int main()  {
32     while( ~scanf("%d", &n ) )  {
33         for( int i=0; i<n; i++ )    
34             scanf("%d", a+i);
35         solve();
36     }
37     return 0;
38 }

 

转载于:https://www.cnblogs.com/TaoTaoCome/p/4744539.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值