北京信息科技大学第十一届程序设计竞赛(重现赛)B kotori和气球

链接: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
using namespace std;
#define PB push_back
#define LL long long
#define FI first
#define SE second
#define POP pop_back()
#define PII pair
#define PCC pair
#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;
}


你可能感兴趣的:(牛客)