【Hihocoder1634】Puzzle Game(DP)】的更多相关文章

题意:有一个n*m的矩阵,每个矩阵里有一个数字a[i][j].现在要求将其中一个格子的值改为p,使得修改后矩阵的最大子矩阵和最小,求这个最小值 n,m<=150,abs(a[i][j])<=1e3 思路:学习cf,也把这种题叫DP了…… 考虑如何快速求出修改后最大子矩阵的值 最大子矩阵有一个O(n^3)的写法:枚举所处的两行或两列,剩下的就当做最大子串做 用这样的方法预处理出上下左右四个方向的最大子矩阵之后,枚举任意一个原最大子矩阵中每个点是否修改 如果有多个最大子矩阵除非枚举到重叠部分否则答…
Description 然而,由于小C沉迷于制作游戏,他完全忘记了自己作为国家集训队的一员,还有156道作业题等他完成.还有一天作业就要截止了,而他一题还没有做.于是他赶紧挑了一道看起来最简单的题: "给定一个整数N,请你求出有多少字符集为1到K之间整数的字符串,使得该字符串可以由一个长度为N的回文串循环移位后得到.所谓循环移位,就是把字符串的某个前缀(可以为空)移到字符串末尾,如"1221"循环移位可以得到"1221"."2211".…
百度之星2017复赛1003 HDU-6146 Pokémon GO 题意 两行n列,只能到相邻格子,可以斜着.求遍历的方案数. 题解 dp[i]从一个点出发遍历长度i最后回到这一列的方案数 dp2[i]从一个点出发遍历长度i的方案数 显然有\(dp[i]=2*dp[i-1]\). dp2[i]就要考虑3种情况:先遍历后面的格子,最后回到当前列,\(2*dp[i-1]\); 先完成当前列,再去别的格子,\(2*dp2[i-1]\); 先遍历下一列,再回来,再遍历后面的列,\(4*dp2[i-2]…
题意:给出一个n*n的矩阵,要求在每个位置涂上黑/白色, 要求满足:任意相邻的两行,其颜色要么完全相同,要么完全相反 任意相邻的两列,其颜色也要么相同要么完全相反 且这个矩形中,不存在任意一个大小大于等于k的同色矩形 求方案数模998244353 n<=5e2,1<=k<=n^2 思路:From https://blog.csdn.net/qq_34454069/article/details/81835687 #include<cstdio> #include<cst…
这个题乍一看就应该是DP,再看一眼数据范围,1000..那就应该是了.然后就向DP的方向想,经过对小数据的计算可以得出,如果我们用f[i][j]来表示前i个数有j个是填了"<"的,那么f[i][j]显然可以表示为f[i][j]+=f[i-1][j]\*(j+1)+f[i-1][j-1] (i-j). 至于原因 1.与f[i-1][j-1] 在这种情况下,由于我们是从前往后去推的,所以当前加入的数一定比前面的都大.那么怎么才能使得其变为前n个有j个<呢? 仔细想一下你就会发现…
题意:有N个数对(a[i],b[i]) 每次可以把(x,y)变成(x+a[i],y+b[i])或(x+b[i],x+a[i]),后者称为交换一次 求使abs(x-y)最小时的最小交换次数 n<=1000 1<=a[i],b[i]<=6 思路:设dp[i,j]为前i个数对,使x-y=j时的最小交换次数 转移即可 ; ..,-..]of longint; a,b:..]of longint; n,i,v,j,t,ans:longint; function min(x,y:longint):l…
题意:有NA个A与NB个B两种任务需要完成,完成一段长度为X的A任务需要时间ta+ka*x*x,B任务类似,连续的同一种任务不能分成两段运行 有P台可以并行运算的计算机,求最快完成所有任务的时间 1≤nA≤60,1≤nB≤601≤nA≤60,1≤nB≤601≤p≤201≤p≤201≤tA≤1000,1≤tB≤1000,1≤kA≤50,1≤kB≤50 思路:无聊在Vijos上随机的一道萎靡题居然花了两天查错 黑书上也有,那种写法看起来很强大,不过下次再写 两次DP,第一次dp[i,j,0/1]表示…
题意:给你n个数字,一共有m种,如果某数为0则该数为空,空的地方可以填任意种类数,但每填一个数字都要花费一定的费用, 从头到尾,所有相邻且相同的数字看作一个集合,求使n个数字的集合数为k所需的最小费用. 思路:设dp[i,j,k]为前i个连续j段结尾为k的最优值,分类讨论DP即可 var dp:array[0..100,0..100,0..100]of int64; p:array[1..100,1..100]of int64; a:array[0..100]of longint; n,m,k1…
题目链接 我DP是真的菜啊啊啊啊啊! f[i][j]表示考虑前i个数,有i-j+1个数组成一个上升子序列,且不以i结尾的尾端最小值. 设a为j个数组成的序列,且以i结尾:b为i-j+1个数组成的序列,且不以i结尾. 从f[i][j]到f[i+1][j+1]的转移如下: 若a后面可以接上第i+1个数,那b就和原来一样.也就是f[i+1][j+1]=min(f[i+1][j+1],f[i][j]) 如果a后面不能接上第i+1个数,那就接到b上.也就是f[i+1][i-j+1]=min(f[i+1][…
题意:From https://blog.csdn.net/m0_37809890/article/details/102886956 思路: 可以发现转移就是右上角的一个区间前缀和 std只要开1倍空间,个人习惯开2倍滚动数组, 1倍有时候没想清楚的前提下初始化或者求前缀和顺序手抖就会gg,反正时空只有常数倍差距 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned int ui…
题意:有一个长为n的串,每个字符是#或者.中的一个,#不超过50个 有3种覆盖串的方式:(.),(..),(.#.),分别能获得g1,g2,g3的收益,覆盖之间不能重叠 第一种方式不能使用超过K次,问能获得的最大总收益,可以不覆盖完所有n个字符 n<=1e5,0<=g1,g2,g3<=1e3 思路:显然#将串分割成了若干段,预处理出段数和每段的长度 设dp[i][j][0/1]为前i段用了j次方式一,最后一个#处有没有用方式三的最大总收益 枚举段中方式二的使用次数进行转移 可以不覆盖完n…
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1475 正反一次lis然后去min{左,右}*2-1即可 #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream&…
题目链接 GuessYCB的题解讲的很棒.就这样. 因为这题我不会,而题解又讲的太全太详细太好了. #include<cstdio> #include<cctype> #include<cstring> #include<algorithm> #define mod 1000000007 inline ;} inline long long read(){ ,f=; char ch=getchar(); while(!isdigit(ch)){ ; ch=g…
CJOJ 1071 [Uva]硬币问题(动态规划) Description 有n种硬币,面值分别为v1, v2, ..., vn,每种都有无限多.给定非负整数S,可以选用多少个硬币,使得面值之和恰好为S?输出硬币数目的最小值和最大值. Input 第一行两个整数,n,S(1≤n≤100, 0≤S≤100000). 第二行n个整数vi-1...n(1≤vi≤S). Output 第一行两个整数,分别表示硬币数目的最小值 a 和最大值 b .无解则输出 -1 . 第二行 a 个整数分别表示使用的是第…
[BZOJ2998]Problem A(动态规划) 题面 BZOJ 题解 一个人的成绩范围可以确定为一个区间 这样就变成了 选择若干区间,不重合, 每个区间有个权值,求最大权值和 这样就可直接\(dp\)了 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #includ…
[BZOJ2428]均分数据(模拟退火) 题面 BZOJ 题解 先说说黄学长的做法: 当温度比较高的时候,贪心 每次随机一个数,把他放进当前和最少的那一组里面 温度足够低的时候就完全随机然后转移 这样子写貌似会挂??? (我只有70分..,洛谷测的) 然后看到了\(ZSY\)巨神的做法 (太强啦,实在是太强啦,强无敌呀) 对于一个排列,分组强制连续 答案显然唯一,做一遍\(dp\)就好 所以退火的时候每次交换两个位置... 不知道为什么这样就过了... 懵逼 #include<iostream>…
[WC2001][cogs358]高性能计算机(动态规划) ##题面 [问题描述] 现在有一项时间紧迫的工程计算任务要交给你--国家高性能并行计算机的主管工程师--来完成.为了尽可能充分发挥并行计算机的优势,我们的计算任务应当划分成若干个小的子任务. 这项大型计算任务包括A和B两个互不相关的较小的计算任务.为了充分发挥并行计算机的运算能力,这些任务需要进行分解.研究发现,A和B都可以各自划分成很多较小的子任务,所有的A类子任务的工作量都是一样的,所有的B类子任务也是如此(A和B类的子任务的工作量…
[Luogu1272]重建道路(动态规划) 题面 题目描述 一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟一的.因此,牧场运输系统可以被构建成一棵树.John想要知道另一次地震会造成多严重的破坏.有些道路一旦被毁坏,就会使一棵含有P(1≤P≤N)个牲口棚的子树和剩余的牲口棚分离,John想知道这些道路的最小数目. 输入输出格式 输入格式: 第1行:2个整数,N和P 第2..N…
[BZOJ2748]音量调节(动态规划) 题面 Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里面写着在每首歌开始之前他想要改变的音量是多少.每一次改变音量,他可以选择调高也可以调低. 音量用一个整数描述. 输入中给定整数beginLevel,代表吉他刚开始的音量,以及整数maxLevel,代表吉他的最大音量.音量不能小于0也不能大于maxLevel.输入文件中还给定了n个整…
[BZOJ3997][TJOI2015]组合数学(动态规划) 题面 BZOJ 洛谷 题解 相当妙的一道题目.不看题解我只会暴力网络流 先考虑要求的是一个什么东西,我们把每个点按照\(a[i][j]\)拆成若干个点,每个具有二维偏序关系的点之间连一条边,于是我们就有了一个\(DAG\),要求的就是\(DAG\)的最小链覆盖. 然后又有最小链覆盖等于最大独立集,所以本质上就是求一个最大的集合满足任意两点之间不存在二维偏序. 于是问题变成了从左下角到右上角找到一条路径使得路径权值最大. 这个东西可以简…
[BZOJ3167][HEOI2013]SAO(动态规划) 题面 BZOJ 洛谷 题解 显然限制条件是一个\(DAG\)(不考虑边的方向的话就是一棵树了). 那么考虑树型\(dp\),设\(f[i][j]\)表示当前点\(i\)在其子树内的排名为\(j\)的方案数. 每次考虑加入一棵子树,即考虑把\(f[v][k]\)加入到\(f[u][i]\)的贡献中. 分类讨论,如果\(v\)应当在\(u\)之前,枚举\(v\)的子树内一共有多少个点在\(u\)之前,那么假设\(u\)当前的序列长度为\(x…
[CF1082F]Speed Dial(动态规划) 题面 CF 洛谷 题解 把\(Trie\)树建出来之后发现就是一个树型\(dp\),每个点会对于其父亲中第一个被标记的点产生贡献. 那么把第一个点压入状态. 设\(f[i][p][k]\)表示当前点\(i\),其到根的链上第一个被标记的点是\(p\),其子树内总共选了\(k\)个点的最小代价. 枚举儿子是选还是不选进行转移. 时间复杂度\(O(n^2k^2)\) #include<iostream> #include<cstdio>…
[BZOJ5336][TJOI2018]party(动态规划) 题面 BZOJ 洛谷 题解 这题好神仙啊... 考虑普通的\(LCS\)的\(dp\),\(f[i][j]=\max\{f[i-1][j],f[i][j-1],f[i-1][j-1]+(A_i==B_j)\}\) 发现对于固定的\(i\)而言,随着\(j\)的增长,相邻的两个数之间的差不超过\(1\),因此直接考虑一个\(2^k\)的状态记录差分的结果. 那么设\(f[i][S]\)表示当前考虑到了第\(i\)位,\(LCS\)的\…
[BZOJ2208][JSOI2010]连通数(Tarjan) 题面 BZOJ 洛谷 题解 先吐槽辣鸡洛谷数据,我写了个\(O(nm)\)的都过了. #include<iostream> #include<cstdio> using namespace std; #define MAX 2020 struct Line{int v,next;}e[MAX*MAX]; int h[MAX],cnt=1; inline void Add(int u,int v){e[cnt]=(Lin…
[BZOJ1802][AHOI2009]checker(动态规划) 题面 BZOJ 洛谷 题解 首先自己观察一波,发现如果有相邻两个格子都是红色的话,那么显然可以在任意位置都存在一个跳棋.可以让两个位置反复互相跳就好了.这样子第一问的答案显然就是\(0\),否则的话第一问的答案就是偶数位置上\(0\)的个数. 如果没有相邻的两个位置都是红格子,我们还可以得出第二问的答案就是偶数位置上红格子的数目. 现在有两个红格子相邻,设\(f[i]\)表示在\(i\)这个位置要出现一个棋子的最小加入的跳棋数目…
Luogu 1312 [NOIP2011]玛雅游戏 (搜索) Description Mayan puzzle 是最近流行起来的一个游戏.游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定的步数内消除所有的方块,消除方块的规则如下: 1. 每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将交换位置(参见输入输出样例说明中的…
[BZOJ1032][JSOI2007]祖玛(动态规划) 题面 BZOJ 洛谷 题解 听说是道假题,假的原因是因为出题人可能没有考虑到祖玛的骚套路,比如可以先打几个球进去再一波消掉.也就是出题人基本默认了打一个球就至少要消去一段. 我们就这么做,那么就是个区间\(dp\)模板题了. #include<iostream> #include<cstdio> #include<cstring> using namespace std; #define MAX 505 inli…
[BZOJ1025][SCOI2009]游戏(动态规划) 题面 BZOJ 洛谷 题解 显然就是一个个的置换,那么所谓的行数就是所有循环的大小的\(lcm+1\). 问题等价于把\(n\)拆分成若干个数,他们的\(lcm\)有多少种不同的情况.那么显然还可以变成有多少个数的\(\sum_{i}p_i^{a_i}\le n\) 这样子随便\(dp\)一下就好了. #include<iostream> #include<cstdio> using namespace std; #defi…
[arc074e]RGB Sequence(动态规划) 题面 atcoder 洛谷 翻译见洛谷 题解 直接考虑暴力\(dp\),设\(f[i][j][k][l]\)表示当前考虑到第\(i\)位,最后一个红绿蓝色出现的位置是哪里,发现显然\(i=max(j,k,l)\),所以只有三维了,直接\(dp\)即可.至于限制每次在右端点考虑一下就好了. #include<iostream> #include<cstdio> #include<vector> using names…
[HDU5909]Tree Cutting(FWT) 题面 vjudge 题目大意: 给你一棵\(n\)个节点的树,每个节点都有一个小于\(m\)的权值 定义一棵子树的权值为所有节点的异或和,问权值为\(0..m-1\)的所有子树的个数 题解 考虑\(dp\) 设\(f[i][j]\)表示以\(i\)为根节点的子树中,异或和为\(j\)的子树的个数 很显然,每次合并就是两个\(dp\)值做\(xor\)卷积 那么直接用\(FWT\)优化就行了 #include<iostream> #inclu…