codevs 2618 核电站问题 题解报告

来源:互联网 发布:c语言移位运算 编辑:程序博客网 时间:2024/05/29 17:40

这里写图片描述

噫。

题目描述 Description
一个核电站有N个放核物质的坑,坑排列在一条直线上。如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质。

任务:对于给定的N和M,求不发生爆炸的放置核物质的方案总数。

输入描述 Input Description
输入文件只一行,两个正整数N,M(N<50,2≤M≤5)

输出描述 Output Description
输出文件只有一个正整数S,表示方案总数。

样例输入 Sample Input
4 3

样例输出 Sample Output
13

数据范围及提示 Data Size & Hint
( N<50,2≤M≤5)

嗯。。动归题;

设F[I]为前 i 个坑 的方案数
在不考虑m的情况下
f[i]=f[i-1]*2;
考虑m
f[i]=f[i-1]*2-f[i-m-1];

嗯;;
代码:

#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<vector>#include<queue>#include<map>#include<set>#include<stack>#include<cstdlib>#include<string>#include<bitset>#include<iomanip>#include<deque>#define INF 1000000000#define fi first#define se second#define N 100005#define P 1000000007#define debug(x) cerr<<#x<<"="<<x<<endl#define MP(x,y) make_pair(x,y)using namespace std;long long n,m,ans=0;long long f[5151];inline int get_num(){int num = 0;char c;bool flag = false;while ((c = getchar()) == ' ' || c == '\n' || c == '\r');if (c == '-') flag = true;else num = c - '0';while (isdigit(c = getchar()))num = num * 10 + c - '0';return (flag ? -1 : 1) * num;}int main(){    cin>>n>>m;    f[0]=1;    for(int i=1;i<=n;i++)    {        if(i<m)        {            f[i]=f[i-1]*2;        }else        {            if(i-m-1==-1)            {                f[i]=f[i-1]*2-1;            }else            f[i]=f[i-1]*2-f[i-m-1];        }    }    cout<<f[n];}
0 0
原创粉丝点击