zoukankan      html  css  js  c++  java
  • 【AGC013D】Piling Up

    题面

    洛谷

    题解

    将每一轮操作之后的状态看作一条折线,其中横坐标是第(i)轮操作,纵坐标是剩余黑球的个数。

    那么构建一条折线的方案就对应了一类不同的放球序列,

    但是如果几条折线你可以上下平移得到就算重了,要保证不重的话,直接让最低点在(x)轴上即可。

    (f_{i,j,0/1})表示当前在第(i)轮,剩(j)个黑球,最低点是否到达过(x)轴,分类讨论一下即可。

    代码

    #include <iostream> 
    #include <cstdio> 
    #include <cstdlib> 
    #include <cstring> 
    #include <cmath> 
    #include <algorithm> 
    using namespace std; 
    const int Mod = 1e9 + 7; 
    const int MAX_N = 3e3 + 5; 
    int N, M; 
    int f[MAX_N][MAX_N][2]; 
    void pls(int &x, int y) { x += y; if (x >= Mod) x -= Mod; } 
    int main () { 
    	cin >> N >> M; 
    	f[0][0][1] = 1; 
    	for (int i = 1; i <= N; i++) f[0][i][0] = 1; 
    	for (int i = 0; i < M; i++) 
    		for (int j = 0; j <= N; j++) { 
    			if (j >= 1) {
    				//2 black
    				pls(f[i + 1][j - 1][1], f[i][j][1]); 
    				if (j == 1) pls(f[i + 1][j - 1][1], f[i][j][0]); 
    				else pls(f[i + 1][j - 1][0], f[i][j][0]); 
    			} 
    			if (j < N) { 
    				//2 white
    				pls(f[i + 1][j + 1][1], f[i][j][1]); 
    				pls(f[i + 1][j + 1][0], f[i][j][0]); 
    			} 
    			if (j >= 1) { 
    				//1 black 1 white 
    				pls(f[i + 1][j][1], f[i][j][1]); 
    				if (j == 1) pls(f[i + 1][j][1], f[i][j][0]); 
    				else pls(f[i + 1][j][0], f[i][j][0]); 
    			} 
    			if (j < N) { 
    				//1 white 1 black 
    				pls(f[i + 1][j][1], f[i][j][1]); 
    				pls(f[i + 1][j][0], f[i][j][0]); 
    			} 
    		} 
    	int ans = 0; 
    	for (int i = 0; i <= N; i++) pls(ans, f[M][i][1]); 
    	printf("%d
    ", ans); 
        return 0; 
    } 
    
  • 相关阅读:
    [cf1097F]Alex and a TV Show
    [cf1097E]Egor and an RPG game
    2.2 物理层下面的传输媒体
    2.1 物理层的基本概念
    8 垃圾回收
    7 直接内存
    6 方法区
    1.5 计算机网络体系结构
    1.4 计算机网络的性能指标
    1.3 计算机网络的定义和分类
  • 原文地址:https://www.cnblogs.com/heyujun/p/12198609.html
Copyright © 2011-2022 走看看