題目
有紅藍球各無限多個,初始時任意從中選擇 個放入盒子。
初始有一個空的序列,接下來依次做 組操作,每組操作爲依次執行下述三個步驟:
(1)從盒子中取出任意一個球插入序列尾;
(2)往盒子中放入紅藍各一個球;
(3)從盒子中取出任意一個球插入序列尾;
求 次操作後,有多少種可能的不同顏色序列,答案對 取模。
解法:動態規劃
令 表示 次操作後盒中剩餘 個紅球,則剩餘 個藍球。按照當前取出的兩個球的顏色分類討論,有四種轉移方式:
然後這樣算顯然會有重複,至於去重嘛。。聽大佬說只要做兩遍dp, 。(證明之類的,挖個坑再說23333)
代碼
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const long long p=1000000007ll;
long long f[3001][3001];
int n,m;
long long dp(int n,int m){
memset(f,0,sizeof(f));
for(int i=0;i<=n;++i)f[0][i]=1ll;
for(int i=1;i<=m;++i)for(int j=0;j<=n;++j){if(j)(f[i][j]+=f[i-1][j]+f[i-1][j-1])%=p;if(j<n)(f[i][j]+=f[i-1][j]+f[i-1][j+1])%=p;}
long long res=0ll;for(int i=0;i<=n;++i)(res+=f[m][i])%=p;return res;
}
int main(){
scanf("%d%d",&n,&m);
printf("%lld",(dp(n,m)-dp(n-1,m)+p)%p);
}