洛谷P1990

这是一道dp的题,好像也不算dp。需要递推,感觉能训练思维!!!很棒的一道题。

覆盖墙壁

关于这道题的分析

  • 状态表示:f[i][0]表示前i列全部填满的所有方案,f[i][1]表示前i列全部填满缺一个的所有方案。属性:方案数
  • 状态计算:f[i][0] = f[i - 1][1] + f[i - 2][0] + 2 * f[i - 1][1]; f[i, 1] = f[i - 1][1] + f[i - 2][0] ;

关于f[i][0]的计算考虑下面3种情况

关于f[i][1]的计算考虑下面两种情况

代码如下:

#include <iostream>

using namespace std;

const int N = 1e6 + 10, mod = 10000;

int f[N][2];

int main()
{
    int n; 
    cin >> n;   
    f[0][0] = 1; f[1][0] = 1; f[2][0] = 2;
    f[0][1] = 1; f[1][1] = 0; f[2][1] = 1;
    for(int i = 3; i <= n; ++ i)
    {
        f[i][0] = ((f[i - 1][0] + f[i - 2][0]) % mod + f[i - 1][1] * 2 % mod) % mod;
        f[i][1] = (f[i - 1][1] + f[i - 2][0]) % mod;
    }
    cout << f[n][0];
    return 0;
}
posted @ 2022-12-14 15:55  cxy8  阅读(42)  评论(0)    收藏  举报