51nod 1852 人行横道(C/C++)

22.7暑假冲刺联训CSP-J 第二场II
第二题人行横道

题目描述
一条有 n 条线的人行横道,这 n 条线是交错的,即一条黑线一条白线。
Noder 要过马路,他不能一步完全跨过马路,途中至少要有一次踩在一条线上。他希望自己每走一步踩过的线,也是黑白交替的 单独一条白线或黑线,也算黑白交替 ,问他有多少种不同的走法。
由于数量太多,只需要输出对 1e9+7 取模的结果。

输入
第一行包含一个整数n(1 ≤ n ≤ 10^6),对应人行横道的长度。

输出
输出可行的方案数对 1e9+7 取模的结果。

数据范围
对于40%的数据,1≤n≤20;
对于60%的数据,1≤n≤1000;
对于100%的数据,1≤n≤106;

输入样例
3

输出样例
6

样例解释
设 3 条线编号为 1,2,3 ,符合条件的走法包括:(以下方案中的数字表示踩到的线)
1 1,2,3
2 1,2
3 2,3
4 1
5 2
6 3

动态规划不知怎么写。

#include <bits/stdc++.h>

using namespace std; 

long long f[1000005],n,m=1e9+7,s;

int main()
{
    cin>>n;
    f[1]=1;
    for(long long i=2;i<=n;i++)
    {
        s=-s;
        s-=f[i-2];
        f[i]=f[i-1]+f[i-1]+m+s+1;
        f[i]%=m;
        s%=m;
    }
    cout<<f[n];
    return 0;
}