zoukankan      html  css  js  c++  java
  • 【CQOI2008】矩阵的个数

    反正对今天是无言。。。

    Description

    给出一个N行3列非负整数矩阵的各行各列之和,统计有多少个矩阵满足此条件。输出答案模10^17的值。
     

    Input

    第一行包含四个正整数N,c1, c2, c3,即行数与三列之和。第二行包含N个正整数,即各行三个数之和。每行每列之和均不超过125。

    Output

    仅一个数,满足条件的矩阵个数模10^17的值。
     

    Sample Input

    3 2 3 4
    1 2 6
    

    Sample Output

    17
     

    Data Constraint

     
     

    Hint

    1<=N<=200

    其实这道题就是DP,如果用暴搜,必爆。。。

    它的思路是这样滴

    我们可以发现,只要决定了第一列和第二列的数,第三列的数就已经是确定了

    那么我们就只需要考虑第一二列的数就行

    那么我们需要五层循环:1.i【1~n】,用来表示的是到第几行

               2.j【0~c1】,用来表示第一列的总和

               3.k【0~c2】,用来表示第二列的总和

               4.x【0~min(j,a[i])】,用来表示第一列的取值,但是取值不能超过它的限制条件

               5.y【0~min(k,a[i]-x)],用来表示第二列的取值,但是取值不能超过它的限制条件

    mlg大佬的帮助下,我成功地意识到滚动的重要性,主要是空间只给了60MB左右,易燃易爆炸?

    其实我们可以发现,我们每一层的状态都是一层层推下来,那么的话,我们就可以发现,我们到达的这一层的状态只与上一层状态有关

    所以一波滚动走起

    对了忘记说动态方程了,其实到这里很明显,就是:

    f[i&1][j][k]+=f[(i&1)^1][j-x][k-y],f[i&1][j][k]%=mod 

    代码献上:     

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    typedef long long ll;
     ll n,c1,c2,c3;
     ll a[300];
     ll f[2][150][150];
    int main(){
        scanf("%lld%lld%lld%lld",&n,&c1,&c2,&c3);
        ll sum=0;
        for(long i=1;i<=n;i++){
        scanf("%lld",&a[i]);
        sum+=a[i];}
        if(sum!=c1+c2+c3) {
            printf("0");
            return 0;
        }        //特判一下,看看所给数据是否满足条件
        f[0][0][0]=1; //初始化,注意
        for(ll i=1;i<=n;i++)
        for(ll j=0;j<=c1;j++)
        for(ll k=0;k<=c2;k++){
        f[i&1][j][k]=0; //记住这一个!!因为是滚动,所以拓展的这一层要初始化
        for(ll x=0;x<=min(j,a[i]);x++)
        for(ll y=0;y<=min(k,a[i]-x);y++)
        f[i&1][j][k]+=f[(i&1)^1][j-x][k-y],f[i&1][j][k]%=100000000000000000;}    
        printf("%lld",f[n&1][c1][c2]);
    }

      

  • 相关阅读:
    ALinq Dynamic 使用指南——前言
    前端与后端分离的架构实例(三)
    前端与后端分离的架构实例(二)
    启动画面QSplashScreen鼠标点击的时候不退出
    Qt组件屏蔽鼠标激活
    Qt LNK2001错误
    QtDesigner中设定一个组件位于另一个组件上方
    QToolButton设置图片
    osgearth_package切片工具切局部影像或者高程tif无法生成切片问题;切完数据集无法显示问题
    Qt输入框添加搜索按钮,以及自动补全内容
  • 原文地址:https://www.cnblogs.com/yuzhe123/p/13347260.html
Copyright © 2011-2022 走看看