【動態規劃】最長連號

原題傳送門ios

思路


碼風醜醜噠算法

儘管是一道入門級別的水題,n<10000,暴力就能夠過,但若n<100000000,就須要咱們偉大的動態規劃出場了QAQ。數組

運用DP,我作出了O(n)的算法。spa

dp[i]表示從上一個連號被中斷的數字的下一個到第i個的連號長度。code

有點難理解哈,看狀態轉移方程吧:
dp[i]=dp[i-1]+1(no[i]=no[i-1]+1)
dp[i]=1 (no[i]≠no[i-1]+1)
(no[]表示輸入的數組)ci

咱們還須要一個tans來記錄當前連號長度,若tans>ans,則將ans設置爲tans,若連號中斷,則將tans重置爲1。get

剩下的就是水代碼了QAQ.io

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;
}
相關文章
相關標籤/搜索