Codevs2618 核电站问题 dp递推 n||nm

来源:互联网 发布:上帝悖论 知乎 编辑:程序博客网 时间:2024/06/05 15:33

Codevs2618 核电站问题

解法一:
设f[i][j]表示前i个坑末尾连续放了j个核物质;

#include <cstdio>#include <cstring>#include <iostream>#include <cstdlib>using namespace std;typedef long long LL;#define MAXN (233)LL dp[MAXN][MAXN];int main(){    LL n, m;    scanf("%I64d%I64d", &n, &m);    dp[1][0] = dp[1][1] = 1;    for(int i = 2; i <= n; ++ i)    {        dp[i][0] = dp[i-1][0];        for(int j = 1; j < m; ++ j)        {            dp[i][j] += dp[i-1][j-1];            dp[i][0] += dp[i-1][j];        }    }    LL ans = 0;    for(int i = 0; i <= m; ++ i)        ans += dp[n][i];    cout << ans << endl;    return 0;}

解法二:
http://blog.csdn.net/lengxuenong/article/details/50535192

#include <cstdio>#include <cstring>#include <iostream>#include <cstdlib>using namespace std;typedef long long LL;#define MAXN (233)LL dp[MAXN];int main(){    LL n, m;    scanf("%I64d%I64d", &n, &m);    dp[0] = 1;    for(int i = 1; i <= n; ++ i)    {        if(i < m) dp[i] = dp[i-1]*2;        else if(i == m) dp[i] = dp[i-1]*2-1;        else dp[i] = dp[i-1]*2 - dp[i-m-1];    }    cout << dp[n];    return 0;}
0 0
原创粉丝点击