您的位置:首页 > 编程语言

牛客网 [编程题] 牛牛的数列 (DP)

2017-05-20 00:26 155 查看
时间限制:1秒

空间限制:32768K

牛牛现在有一个n个数组成的数列,牛牛现在想取一个连续的子序列,并且这个子序列还必须得满足:最多只改变一个数,就可以使得这个连续的子序列是一个严格上升的子序列,牛牛想知道这个连续子序列最长的长度是多少。 
输入描述:
输入包括两行,第一行包括一个整数n(1 ≤ n ≤ 10^5),即数列的长度;
第二行n个整数a_i, 表示数列中的每个数(1 ≤ a_i ≤ 10^9),以空格分割。


输出描述:
输出一个整数,表示最长的长度。


输入例子:
6
7 2 3 1 5 6


输出例子:
5


解题思路:dp[i][0]表示第i位不替换的最大长度,dp[i][1]表示第i位替换的最大长度,然后分类讨论,dp走一遍就好了。

/* ***********************************************
©ª ©³©·¡¡¡¡¡¡©³©· ©ª
©ª©³©¿©ß©¥©¥©¥©¿©ß©· ©ª
©ª©§¡¡¡¡¡¡¡¡¡¡¡¡¡¡©§ ©ª
©ª©§¡¡¡¡¡¡©¥¡¡¡¡¡¡©§ ©ª
©ª©§¡¡©×©¿¡¡©»©×¡¡©§ ©ª
©ª©§¡¡¡¡¡¡¡¡¡¡¡¡¡¡©§ ©ª
©ª©§¡¡¡¡¡¡©ß¡¡¡¡¡¡©§ ©ª
©ª©»©¥©·¡¡Âí¡¡©³©¥©¿ ©ª
©ª¡¡¡¡©§¡¡ÀÕ¡¡©§¡¡¡¡©ª¡¡¡¡¡¡¡¡¡¡¡¡
©ª¡¡¡¡©§¡¡¸ê¡¡©»©¥©¥©¥©· ©ª
©ª¡¡¡¡©§¡¡±Ú¡¡¡¡¡¡¡¡¡¡©Ç©·©ª
©ª¡¡¡¡©§¡¡µÄ²ÝÄàÂí¡¡¡¡©³©¿©ª
©ª¡¡¡¡©»©·©·©³©¥©×©·©³©¿ ©ª
©ª¡¡¡¡¡¡©§©Ï©Ï¡¡©§©Ï©Ï ©ª
©ª¡¡¡¡¡¡©»©ß©¿¡¡©»©ß©¿ ©ª
************************************************ */
//#pragma comment(linker, "/STACK:102400000,102400000")
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <bitset>
using namespace std;

#define rep(i,a,b) for (int i=(a),_ed=(b);i<=_ed;i++)
#define per(i,a,b) for (int i=(a),_ed=(b);i>=_ed;i--)
#define pb push_back
#define mp make_pair
const int inf_int = 2e9;
const long long inf_ll = 2e18;
#define inf_add 0x3f3f3f3f
#define mod 1000000007
#define LL long long
#define ULL unsigned long long
#define MS0(X) memset((X), 0, sizeof((X)))
#define SelfType int
SelfType Gcd(SelfType p,SelfType q){return q==0?p:Gcd(q,p%q);}
SelfType Pow(SelfType p,SelfType q){SelfType ans=1;while(q){if(q&1)ans=ans*p;p=p*p;q>>=1;}return ans;}
#define Sd(X) int (X); scanf("%d", &X)
#define Sdd(X, Y) int X, Y; scanf("%d%d", &X, &Y)
#define Sddd(X, Y, Z) int X, Y, Z; scanf("%d%d%d", &X, &Y, &Z)
#define reunique(v) v.resize(std::unique(v.begin(), v.end()) - v.begin())
#define all(a) a.begin(), a.end()
#define mem(x,v) memset(x,v,sizeof(x))
typedef pair<int, int> pii;
typedef pair<long long, long long> pll;
typedef vector<int> vi;
typedef vector<long long> vll;
inline int read(){int ra,fh;char rx;rx=getchar(),ra=0,fh=1;while((rx<'0'||rx>'9')&&rx!='-')rx=getchar();if(rx=='-')fh=-1,rx=getchar();while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra*fh;}

int a[100005];
int dp[100005][2];

int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
//ios::sync_with_stdio(0);
//cin.tie(0);
int n = read();
for(int i=1;i<=n;i++) a[i] = read();
memset(dp,0,sizeof dp);
dp[1][0] = dp[1][1] = 1;
int res = 1;
for(int i=2;i<=n;i++)
{
if(a[i]>a[i-1])
{
dp[i][0] = dp[i-1][0] + 1;
dp[i][1] = dp[i-1][1] + 1;
res = max(res,max(dp[i][0],dp[i][1]));
}
else
{
if(i>2 && a[i]==a[i-2]+1)
{
dp[i][0] = 1;
dp[i][1] = 2;
res = max(res,dp[i][1]);
}
else if(i>2 && a[i]-a[i-2]>=2)
{
dp[i][1] = dp[i-1][0] + 1;
dp[i][0] = 1;
res = max(res,dp[i][1]);
}
else if(i<n && a[i+1]-a[i-1]>=2)
{
dp[i][1] = dp[i-1][0] + 1;
dp[i][0] = 1;
res = max(res,dp[i][1]);
}
else
{
dp[i][1] = 1;
dp[i][0] = 1;
res = max(res,max(dp[i][0],dp[i][1]));
}
}
}

cout<<res<<endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: