【CF1252J】Tiling Terrace(DP)】的更多相关文章

题意:有一个长为n的串,每个字符是#或者.中的一个,#不超过50个 有3种覆盖串的方式:(.),(..),(.#.),分别能获得g1,g2,g3的收益,覆盖之间不能重叠 第一种方式不能使用超过K次,问能获得的最大总收益,可以不覆盖完所有n个字符 n<=1e5,0<=g1,g2,g3<=1e3 思路:显然#将串分割成了若干段,预处理出段数和每段的长度 设dp[i][j][0/1]为前i段用了j次方式一,最后一个#处有没有用方式三的最大总收益 枚举段中方式二的使用次数进行转移 可以不覆盖完n…
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*m的矩阵,每个矩阵里有一个数字a[i][j].现在要求将其中一个格子的值改为p,使得修改后矩阵的最大子矩阵和最小,求这个最小值 n,m<=150,abs(a[i][j])<=1e3 思路:学习cf,也把这种题叫DP了…… 考虑如何快速求出修改后最大子矩阵的值 最大子矩阵有一个O(n^3)的写法:枚举所处的两行或两列,剩下的就当做最大子串做 用这样的方法预处理出上下左右四个方向的最大子矩阵之后,枚举任意一个原最大子矩阵中每个点是否修改 如果有多个最大子矩阵除非枚举到重叠部分否则答…
题意:有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][…