zoukankan      html  css  js  c++  java
  • 【AGC013D】Pilling Up【动态规划】

    首先我们很容易想到一个dp。
    f[i][j]表示i次操作后有j个红球的拿球的方案数。
    易得转移
    j>0
    f[i][j]>f[i+1][j1]
    f[i][j]>f[i+1][j]
    j<n
    f[i][j]>f[i+1][j+1]
    f[i][j]>f[i+1][j]
    但是这样子我们会算重复,因为询问的是颜色序列的方案数,不是拿球的方案数。
    观察发现答案为共n个球的答案减去共n1个球的答案,于是好像没了?
    怎么证?我也不知道QAQ

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int N=3005,mod=1000000007;
    int n,m,f[N][N*2];
    int calc(int n){
        memset(f,0,sizeof(f));
        for(int i=0;i<=n;i++){
            f[0][i]=1;
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<=n;j++){
                if(j>0){
                    f[i+1][j-1]=(f[i+1][j-1]+f[i][j])%mod;
                    f[i+1][j]=(f[i+1][j]+f[i][j])%mod;
                }
                if(j<n){
                    f[i+1][j+1]=(f[i+1][j+1]+f[i][j])%mod;
                    f[i+1][j]=(f[i+1][j]+f[i][j])%mod;
                }
            }
        }
        int ans=0;
        for(int i=0;i<=n;i++){
            ans=(ans+f[m][i])%mod;
        }
        return ans;
    }
    int main(){
        scanf("%d%d",&n,&m);
        printf("%d
    ",(calc(n)-calc(n-1)+mod)%mod);
        return 0;
    }
  • 相关阅读:
    STL Allocator
    Several NeedToKnow(assert/stdin/stdout/CString/Standard C++ Library)
    VS Project Property Sheet
    进度总结(3)
    进度总结(2)
    进度总结(4)
    进度总结(7)
    进度总结(1)
    进度总结(5)
    进度总结(6)
  • 原文地址:https://www.cnblogs.com/2016gdgzoi471/p/9476833.html
Copyright © 2011-2022 走看看