链接:https://ac.nowcoder.com/acm/contest/940/B
来源:牛客网
题目描述
kotori最近迷上了摆气球的游戏。她一共有n种气球,每种气球有无数个。她要拿出若干个气球摆成一排。
但是,由于气球被施放了魔法,同样种类的气球如果相邻会发生爆炸,因此若两个相邻的气球种类相同被视为不合法的。
kotori想知道,摆成一排m个一共有多少种不同的方案?
由于该数可能过大,只需要输出其对109取模的结果。
输入描述:
输入仅有一行,为两个整数n和m(1≤n,m≤100)
输出描述:
输出一个整数,为方案数对109取模的结果。
思路
dp递推,在第i个位置放颜色为x的球的方案数为在i-1处放除x以外的球的方案数之和
状态转移方程:s[i][x]=sum{s[i-1][y],y!=x}
代码
#include<bits/stdc++.h>
using namespace std;
#define PB push_back
#define LL long long
#define FI first
#define SE second
#define POP pop_back()
#define PII pair<LL,LL>
#define PCC pair<char,char>
#define endl '\n'
#define ls x<<1
#define rs x<<1|1
#define m(x) a[x].l+a[x].r>>1
const int N=1e3+7;
const int INF=1e8,mod=109;
LL a[N][N];
int n,m;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++){
a[1][i]=1;
}
for(int i=2;i<=m;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
if(k==j)continue;
a[i][j]=(a[i][j]+a[i-1][k])%mod;
}
}
}
LL ans=0;
for(int i=1;i<=n;i++)ans+=a[m][i];
ans%=mod;
cout<<ans;
return 0;
}