cf 869c The Intriguing Obsession

题意:有三种三色的岛,用a,b,c来标识这三种岛。然后规定,同种颜色的岛不能相连,而且同种颜色的岛不能和同一个其他颜色的岛相连。问有多少种建桥的方法。

题解:em....dp。我们先看两个岛之间怎么个连法。由题意可得岛与岛之间的链接是单射,我们定义f[a][b],表示有a个颜色1的岛和b个颜色2的岛想连的方案数。

首先当a==1 || b==1的时候 f[a][b]=(b+1)或者 (a+1)。然后尝试去找状态转移方程,我们对一个岛去连接另一个岛只有连或者不连两种状态,那么对于不连的状态为f[a-1][b];连的状态为b*f[a-1][b-1],这里要乘上一个b,因为有b个岛可连。

ac代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define mt(a) memset(a,0,sizeof(a))
#include <map>
#include <string>
#include <queue>
#include <stack>
#include <cmath>
using namespace std;
typedef long long ll;
ll mod=998244353;
ll f[5010][5010];
int main()
{
    ll a,b,c;
    cin>>a>>b>>c;
    int mx=max(a,max(b,c));
    mt(f);
    for(int i=1;i<=mx;i++)
    {
        f[i][1]=i+1;
        f[1][i]=i+1;
    }
    for(int i=2;i<=mx;i++)
    {
        for(int j=2;j<=mx;j++)
        {
            f[i][j]=(j*f[i-1][j-1]+f[i-1][j])%mod;
        }
    }
    ll ans=1;
    ans=(ans*f[a][b])%mod;
    ans=(ans*f[a][c])%mod;
    ans=(ans*f[b][c])%mod;
    cout<<ans<<endl;
    return 0;
}

 

posted @ 2017-10-08 16:27  猪突猛进!!!  阅读(248)  评论(0编辑  收藏  举报