1 条题解

  • 1
    @ 2025-11-22 9:42:29

    比较复杂的DP\texttt{\color{blue}DP},注释都在了,难度普及/提高-\textbf{\color{gold}普及/提高-}

    #include<bits/stdc++.h>
    using namespace std;
    const int mod=1000000007;
    int n,f[10000005][3];
    //f[i][0]:上方比下方多一格
    //f[i][1]:两行积木数相等
    //f[i][2]:下方比上方多一格
    int main(){
    	cin>>n;	
        f[0][1]=1;
    	for(int i=1;i<=n;i++){
    		f[i][0]=(f[i-2][1]+f[i-1][2])%mod;//上方比下方多一格,可以用I横向填补第i列和第i−1列(f[i-1][2]),或者用L直接填补第i列和第i−1列(f[i-2][1])
    		f[i][1]=((f[i-2][1]+f[i-1][1])%mod+(f[i-1][0]+f[i-1][2])%mod)%mod;//两行积木数相等,可以用两个I横向填补第i列和第i−1列(f[i-2][1]),或者用一个I纵向填补第i列(f[i-1][1]),或者用一个L填补第i列和第i−1列的第二行(f[i-1][0]),或者用一个L填补第i列和第i−1列的第一行(f[i-1][2])
    		f[i][2]=(f[i-2][1]+f[i-1][0])%mod;//下方比上方多一格,可以用I横向填补第i列和第i−1列(f[i-1][0]),或者用L直接填补第i列和第i−1列(f[i-2][1])
    	}
    	cout<<f[n][1];
    }
    

    本题比较坑的点是空间小,开long long就会MLE\texttt{\color{navy}MLE}(我在某谷也被坑了一遍),所以做题的时候一定要谨慎,防止爆0!

    信息

    ID
    12769
    时间
    1000ms
    内存
    128MiB
    难度
    5
    标签
    递交数
    24
    已通过
    6
    上传者