C. Colorful Bricks

探讨了在限定颜色和特定条件下,计算排列组合数量的动态规划算法。通过实例解析了方程dp[i][j]的含义及计算过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C. Colorful Bricks

题目:
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
On his free time, Chouti likes doing some housework. He has got one new task, paint some bricks in the yard.

There are nn bricks lined in a row on the ground. Chouti has got mm paint buckets of different colors at hand, so he painted each brick in one of those mm colors.

Having finished painting all bricks, Chouti was satisfied. He stood back and decided to find something fun with these bricks. After some counting, he found there are kk bricks with a color different from the color of the brick on its left (the first brick is not counted, for sure).

So as usual, he needs your help in counting how many ways could he paint the bricks. Two ways of painting bricks are different if there is at least one brick painted in different colors in these two ways. Because the answer might be quite big, you only need to output the number of ways modulo 998244353998244353.

Input
The first and only line contains three integers nn, mm and kk (1≤n,m≤2000,0≤k≤n−11≤n,m≤2000,0≤k≤n−1) — the number of bricks, the number of colors, and the number of bricks, such that its color differs from the color of brick to the left of it.

Output
Print one integer — the number of ways to color bricks modulo 998244353998244353.

Examples
inputCopy
3 3 0
outputCopy
3
inputCopy
3 2 1
outputCopy
4
Note
In the first example, since k=0k=0, the color of every brick should be the same, so there will be exactly m=3m=3 ways to color the bricks.

In the second example, suppose the two colors in the buckets are yellow and lime, the following image shows all 44 possible colorings.

代码如下:

#include<bits/stdc++.h>
using namespace std;
#define Mod 998244353
#define maxn 2010
long long dp[maxn][maxn];
int main()
{
    int n,m,k;
    cin >> n >> m >> k;
    dp[1][0] = m;
    for(int i = 2;i < n + 1;i++)
    {
        for(int j = 0;j < i;j++)
        {
            if(!j) dp[i][j] = dp[i - 1][j];
            else dp[i][j] = (dp[i - 1][j]  + dp[i - 1][j - 1] * (m - 1) % Mod) % Mod;
        }
    }
    cout << dp[n][k] << endl;
    return 0;
}

这是一道dp题(和高中学的排列组合有些相似),方程为:dp[i][j]=dp[i-1][j]+dp[i-1][j-1](M-1),这里dp数组需要开long long型,否则会输入超出。另外每次dp[i-1][j-1](M-1)都需要mod一下否则数据会超出。

接下来解释一下方程,i块砖j中不同砖的总数其实就是对最后一块砖进行讨论,如果到倒数第二块砖的总数已经满足j种,那么只要最后一块砖和倒数第二块砖的颜色相同就可以,如果到倒数第二块砖的总数还差一种,那只要满足最后一块砖与倒数第二块砖颜色不同即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值