【JZOJ4901】【NOIP2016提高A组集训第18场11.17】矩阵
题目描述
他是一名普通的农电工,他以一颗无私奉献的爱岗敬业之心,刻苦钻研业务,以娴熟的技术、热情周到的服务赢得了广大客户的尊敬和赞美。他就是老百姓称为“李电”的李春来。 
众所周知,李电很喜欢YY。一天,他又YY 了奇怪的东西。他假设他自己成了神,然后他说:“出来吧,矩阵。”然后一个N _M 的矩阵从天而降。他为了不要让矩阵太大而使得自己眼花缭乱,所以他将M 固定在了3。但是,一天之后,他想继续他之前的YY,继续玩他的矩阵,但是他的记忆力太差了,所以他不记得他原来的矩阵长得什么样,所幸的是他昨天记录下了矩阵中每行每列的和,还有矩阵的每项都是非负整数。所以他想知道满足这样条件的矩阵总共有多少种。
数据范围
对于20% 的数据,满足n <= 3,0<=a,b,c,s_i<=10 
对于40% 的数据,满足n<=10,0<=a,b,c,s_i<=20 
对于60% 的数据,满足n<=40,0<=a,b,c,s_i<=40 
对于100% 的数据,满足n<=125,0<=a,b,c,s_i<=125
=w=
设f[i][j][k]表示,第i行中第一列填个j,第二列中填个k。 
f[i][j][k]=∑f[i−1][j−a][k−b]并且满足a+b<=s[i]。 
然后咧,这个是O(n5)的。 
考虑一个第i行: 
 
根据转移方程,f[i][j][k]是由图中这个黑色的等腰直角三角形转移过来的。 
那么考虑维护这个等腰直角三角形: 
黑色等腰直角三角形=红色长方形-(黄色等腰直角三角形-青绿色等腰直角三角形) 
显然矩形前缀和以及腰所在的直线在x轴的等腰直角三角形前缀和容易维护。
时间复杂度为O(n3)。
代码
Const
        maxn=135;
        mo=100000000000000000;
Var
        n,i,j,k,l,o:longint;
        m1,m2,m3:longint;
        f:array[0..maxn,0..maxn,0..maxn] of int64;
        a,sum:array[0..maxn] of longint;
Function max(a,b:longint):longint;
begin
        if (a>b) then exit(a);
        exit(b);
end;
Begin
        assign(input,'mat.in');reset(input);
        assign(output,'mat.out');rewrite(output);
        readlN(n);
        readlN(m1,m2,m3);
        for i:=1 to n do
        begin
                read(a[i]);
                sum[i]:=sum[i-1]+a[i];
        end;
        if (sum[n]>m1+m2+m3) or (sum[n]<m1+m2+m3) then
        begin
                writeln(0);
        end
        else
        begin
                f[0][0][0]:=1;
                for i:=1 to n do
                begin
                        for j:=0 to m1 do
                                for k:=0 to m2 do
                                begin
                                        if (sum[i]<j+k) then break;
                                        if (sum[i]-j-k>m3) then continue;
                                        for l:=0 to j do
                                                for o:=max(0,j+k-a[i]-l) to k do
                                                begin
                                                        if (sum[i]-j-k>=sum[i-1]-l-o) then
                                                        begin
                                                                f[i][j][k]:=(f[i][j][k]+f[i-1][l][o]) mod mo;
                                                        end;
                                                end;
                                end;
                end;
                writeln(f[n][m1][m2]);
        end;
        close(input);close(output);
End.
=o=
当一个f[i]从f[i-1]转移过来时,可以画个平面直角坐标系,看看要维护的是什么。 
有必要的话,建立空间直角坐标系。
【JZOJ4901】【NOIP2016提高A组集训第18场11.17】矩阵的更多相关文章
- JZOJ 【NOIP2016提高A组集训第16场11.15】兔子
		JZOJ [NOIP2016提高A组集训第16场11.15]兔子 题目 Description 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3 ... 
- JZOJ 【NOIP2016提高A组集训第16场11.15】SJR的直线
		JZOJ [NOIP2016提高A组集训第16场11.15]SJR的直线 题目 Description Input Output Sample Input 6 0 1 0 -5 3 0 -5 -2 2 ... 
- 【NOIP2016提高A组集训第4场11.1】平衡的子集
		题目 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 分析 如果暴力枚举每个人被分到哪 ... 
- 【JZOJ4846】【NOIP2016提高A组集训第5场11.2】行走
		题目描述 数据范围 对于70%的数据保证 n <= 1000 对于100%的数据保证 n,q <= 10^5,c_i,v_i <= 10^{18} 保证每次修改后的边权小于等于原来的 ... 
- 【JZOJ4841】【NOIP2016提高A组集训第4场11.1】平衡的子集
		题目描述 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 数据范围 40%的数据满足: ... 
- 【NOIP2016提高A组集训第14场11.12】随机游走
		题目 YJC最近在学习图的有关知识.今天,他遇到了这么一个概念:随机游走.随机游走指每次从相邻的点中随机选一个走过去,重复这样的过程若干次.YJC很聪明,他很快就学会了怎么跑随机游走.为了检验自己是不 ... 
- 【NOIP2016提高A组集训第13场11.11】最大匹配
		题目 mhy12345学习了二分图匹配,二分图是一种特殊的图,其中的点可以分到两个集合中,使得相同的集合中的点两两没有连边. 图的"匹配"是指这个图的一个边集,里面的边两两不存在公 ... 
- 【NOIP2016提高A组集训第14场11.12】随机游走——期望+树形DP
		好久没有写过题解了--现在感觉以前的题解弱爆了,还有这么多访问量-- 没有考虑别人的感受,没有放描述.代码,题解也写得歪歪扭扭. 并且我要强烈谴责某些写题解的代码不打注释的人,像天书那样,不是写给普通 ... 
- 【JZOJ4895】【NOIP2016提高A组集训第16场11.15】三部曲
		=v= 因为外来的入侵,国王决定在某些城市加派士兵.所有城市初始士兵数量为0.当城市 被加派了k名士兵时.城市i的所有子城市需要被加派k+1名士兵.这些子城市的所有子城市需要被加派k+2名士兵.以此类 ... 
随机推荐
- C++与Matlab混合编程之:矩阵数据结构
			项目需要将matlab代码写成C++,准备用opencv.opencv中矩阵的存储与matlab有所不同,应注意以下问题: 1.matlab中矩阵是按照列优先存储的.对于n0*n1*...*nn维的矩 ... 
- #include <filename.h> 和 #include“filename.h” 有什么区别
			对于#include <filename.h> ,编译器从标准库路径开始搜索filename.h,对于#include “filename.h” ,编译器从用户的工作路径开始搜索filen ... 
- 从web.xml入手分析jeecms配置文件
			web.xml文件是web系统的核心配置文件,里面的所有配置都会加载的运行时的web容器,从她可以了解到整个web项目的配置情况.jeecms的所有配置文件都在config文件夹下面,通过web. ... 
- java基础之异常。
			异常: (1)异常:异常就是Java程序在运行过程中出现的错误. 异常由来:问题也是现实生活中一个具体事务,也可以通过java 的类的形式进行描述,并封装成对象.其实就是Java对不正常情况进行描述后 ... 
- 轻松搞定 JS 的this、call和apply
			年前最后一篇文章,提前祝大家春节快乐.对了,还有369就要2018年了,提前祝大家2018年春节快乐. .. .vr qBMBBBMBMY 8BBBBBOBMBMv iMBMM5vOY:BMBBv . ... 
- 在Ubuntu Server 14.04上源码安装Odoo 9.0
			1. 更新Ubuntu服务器软件源 sudo apt-get update #更新软件源 sudo apt-get dist-upgrade #更新软件包,自动查找依赖关系 sudo shutdown ... 
- phpstudy安装好之后mysql无法启动(亲测可行)
			安装好phpstudy后,Apache可以启动,Mysql无法启动. 尝试解决办法:可能是之前已经装过Mysql,要把系统服务里面的MySQL删除,留下MySQLa服务. 在cmd命令行下输入:sc ... 
- Java review-basic1
			1. Dependency Injection Answer: Any application is composed of many objects that collaborate with ea ... 
- win7开机启动项设置
			Windows系统自身就有启动项命令可以进行设置: 要说到修改启动项,当然首推Windows系统自带的“MSCONFIG”命令,XP等其他Windows系统用户使用方法是一模一样的. 1.点击“开始” ... 
- WPF 单个模块换肤
			xmal: <Window x:Class="wpfSkin.MainWindow" xmlns="http://schemas.microsoft.com/win ... 
