首页 > 其他分享 >20221005_T1C_思维dp

20221005_T1C_思维dp

时间:2022-11-18 21:24:11浏览次数:33  
标签:20221005 T1C int 个数 read 白球 dp 重复

题意

一开始有 \(n\) 个颜色为黑白的球,但不知道黑白色分别有多少, \(m\) 次操作,每次先拿出一个球,再放入黑白球各一个,再拿出一个球,最后拿出的球按顺序排列会形成一个颜色序列,求颜色序列有多少种。答案对 \(10^9+7\) 取模。

\(n,m\) 小于等于 \(3000\)。

题解

赛时得分:0/100

并不简单的一道题。

如果就进行普通的 dp 因为各种重复的问题显然不对,现在主要问题就是如何去重。

假如说白球个数是 \(x\),那么黑球个数就是 \(n-x\) 个。结论是,我们只需要取白球个数中途恰好为 0 的那些方法。

为什么不会遗漏。因为任意的方法,只要合法,我向下移到 0 的位置总归是成立的。(这里在说那张图)为什么不会重复,因为如果两个东西重复了,那么偏移量不可能是 0,但是向上偏移就不满足有 0 了,向下偏移就不满足球的个数是正数了。

既然已经知道了取过 0 的,如果快速计算呢?

我们只需要用 \(n\) 的答案减去 \(n-1\) 的答案就好了,因为 \(n-1\) 的答案你可以恰好认为固定放了一个白球在盒子里,那么这样的话白球个数不可能为 0,这也就是重复算的情况。

代码

#include <bits/stdc++.h>
using namespace std;
template <typename T>inline void read(T& t){t=0; register char ch=getchar(); register int fflag=1;while(!('0'<=ch&&ch<='9')) {if(ch=='-') fflag=-1;ch=getchar();}while(('0'<=ch&&ch<='9')){t=t*10+ch-'0'; ch=getchar();} t*=fflag;}
template <typename T,typename... Args> inline void read(T& t, Args&... args) {read(t);read(args...);}
const int N = 3e3 + 10, inf = 0x3f3f3f3f;

int n, m;

const int P = 1e9 + 7;

int dp[N][N];

int solve(int n) {
    memset(dp, 0, sizeof(dp));
    for(int i = 0; i <= n; ++i) dp[1][i] = 1;
    for(int i = 2; i <= m; ++i) {
        for(int j = 0; j <= n; ++j) {
            if(j) dp[i][j] = (dp[i][j] + dp[i - 1][j - 1]) % P;
            if(n - j) dp[i][j] = (dp[i][j] + dp[i - 1][j + 1]) % P;
            if(j) dp[i][j] = (dp[i][j] + dp[i - 1][j]) % P;
            if(n - j) dp[i][j] = (dp[i][j] + dp[i - 1][j]) % P;
        }
    }
    int ans = 0;
    for(int i = 0; i <= n; ++i) ans = (ans + dp[m][i]) % P;
    return ans;
}

int main() {
    // freopen("easyhard.in", "r", stdin);
    // freopen("easyhard.out", "w", stdout);
    read(n, m); ++m;
    cout << (solve(n) - solve(n - 1) + P) % P << endl;
    return 0;
}

标签:20221005,T1C,int,个数,read,白球,dp,重复
From: https://www.cnblogs.com/Mercury-City/p/16904919.html

相关文章

  • tcp和udp:发送和接收工具
    字符串转16进制字符串''' 主要使用到了binascii内置模块'''代码'''将字符串转为对应的16进制:params需要转换的内容:parambyteslens转换完后的长......
  • dp交换值域定义域
    前言最近心血来潮学了一下这个套路?感觉很高级qwq。正文我不好归纳,但他们大体都是一样的。T1[AGC033D]Complexity题意给定一个\(N\)行\(M\)列的字符矩阵。......
  • codeforces 2000左右dp题目练习
    栾巨的dp题单,刷完他要v我500可以提升dp水平。1.YaroslavandTwoStrings白给题,令\(f_{i,0/1,0/1}\)表示前\(i\)位,有无小于,有无大于,根据每位的字符转移即可。2.To......
  • dpm中的参数和颗粒数据读取
    rho0表示颗粒密度。sizeDistribution中的fixedvaludedistribution的value值表示颗粒直径(可以设置不同的直径分布函数和固定值)。cloudFunction中可以设置关于cloud的不同......
  • 【SSL 1590】旅游(线段树优化DP)
    旅游题目链接:SSL1590题目大意要从x号点依次按编号走到y号点,每次可以选择跳最多z个点,即从i到i+z。每到一个点都要支付a的费用,到一些给出的特定点有其对应的......
  • 闫式DP分析法
    闫式DP分析法闫式DP分析法的核心思想是从集合的角度来分析DP问题。所有的DP问题都可以使用闫式DP分析法进行分析。(经过70道题目验证通过)1.选择DP问题:背包模型2.序列DP......
  • python基础入门之黏包、UDP代码、多道技术、进程
    python基础入门之黏包、UDP代码、多道技术、进程目录python基础入门之黏包、UDP代码、多道技术、进程黏包现象黏包的解决方案UDP基本代码使用并发编程理论之操作系统发展......
  • UDP协议和实战、并发编程理论、多道技术、进程理论
    今日内容UDP协议和实战并发编程理论多道技术进程理论进程的并行与并发进程的三状态UDP协议#客户端importsocket#指定使用UDP协议,不指定的话......
  • 进入python的世界_day33_网络编程—— 黏包现象、UDP协议、并发编程理论
    一、黏包现象1.何为黏包​ 流逝协议:所有的数据类似于水流连接在一起的​ 数据量很小并且时间间隔很多那么就会自动组织到一起recv​ 我们不知道即将要接收的......
  • 单调队列优化DP
    先存这里理解了再继续编写CF1077F2PictureswithKittens(hardversion)#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constllN=5e3+10......