【动态规划】最长连号

廉价感情. 提交于 2019-11-30 02:02:18

原题传送门

思路


码风丑丑哒

尽管是一道入门级别的水题,n<10000,暴力就可以过,但若n<100000000,就需要我们伟大的动态规划出场了QAQ。

运用DP,我做出了O(n)的算法。

dp[i]表示从上一个连号被中断的数字的下一个到第i个的连号长度。

有点难理解哈,看状态转移方程吧:
dp[i]=dp[i-1]+1(no[i]=no[i-1]+1)
dp[i]=1 (no[i]≠no[i-1]+1)
(no[]表示输入的数组)

我们还需要一个tans来记录当前连号长度,若tans>ans,则将ans设置为tans,若连号中断,则将tans重置为1。

剩下的就是水代码了QAQ.

Code


#include<iostream>
#include<cstdio>

using namespace std;

const int MAX=10001;
int dp[MAX],no[MAX];
int n,ans=1,tans; 

int main()
{
    //初始化
    dp[1]=1;
    //freopen("testdata(3).txt","r",stdin);
    //读入
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>no[i];
    }
    
    //装叉走起
    for(int i=2;i<=n;i++)
    {
        if(no[i]==no[i-1]+1)
        {
            dp[i]=dp[i-1]+1;
            tans++;
            if(tans>ans)
            {
                ans=tans;
            }
        }
        else
        {
            dp[i]=1;
            tans=1;
        }
    }
    
    //输出
    cout<<ans<<endl;
    return 0;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!