zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    2. Add Two Numbers
    1. Two Sum
    leetcode 213. 打家劫舍 II JAVA
    leetcode 48. 旋转图像 java
    leetcode 45. 跳跃游戏 II JAVA
    leetcode 42. 接雨水 JAVA
    40. 组合总和 II leetcode JAVA
    24. 两两交换链表中的节点 leetcode
    1002. 查找常用字符 leecode
    leetcode 23. 合并K个排序链表 JAVA
  • 原文地址:https://www.cnblogs.com/z1141000271/p/7637735.html
Copyright © 2011-2022 走看看