LightOJ - 1246 - Colorful Board(DP)】的更多相关文章

链接: https://vjudge.net/problem/LightOJ-1246 题意: You are given a rectangular board. You are asked to draw M horizontal lines and N vertical lines in that board, so that the whole board will be divided into (M+1) x (N+1) cells. So, there will be M+1 ro…
http://lightoj.com/volume_showproblem.php?problem=1246 题意 有个(M+1)*(N+1)的棋盘,用k种颜色给它涂色,要求曼哈顿距离为奇数的格子之间不能涂相同的颜色,每个格子都必须有颜色,问可行的方案数. 分析 经一波分析,根据曼哈顿距离为奇数这一信息,可以将棋盘分为两部分,也就是相邻格子不能有相同颜色.一种颜色只能在一个部分中出现.现在考虑对一个部分的格子操作, dp[i][j]表示i个格子选择用了j种颜色的方案数,于是可以得到这样的递推式:…
1246 - Colorful Board    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB You are given a rectangular board. You are asked to draw M horizontal lines and N vertical lines in that board, so that the whole board will be divide…
题目链接:http://lightoj.com/volume_showproblem.php?problem=1032 #include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include <algorithm> #include <queue> #include <vector> using namespace std; ;…
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1017 搞了一个下午才弄出来,,,,, 还是线性DP做的不够啊 看过数据量就知道状态转移方程和x,没有关系 然后再仔细推导就会知道整个转移方程只和k与y的差值有关 然后继续推导.... 定义dp[i][j]表示表示第j步删除最上边的i点, 定义mv[i]表示删除i点的同时可以向下移动的最远位置(可以预处理出来) 那么dp[i][j]=max(dp[i-1][j],dp[i-mv…
1381 - Scientific Experiment Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lightoj.com/volume_showproblem.php?problem=1381 Description John wants to be a scientist. A first step of becoming a scientist is to perform experiment. John has de…
problem=1068">http://www.lightoj.com/volume_showproblem.php?problem=1068 求出区间[A,B]内能被K整除且各位数字之和也能被K整除的数的个数.(1 ≤ A ≤ B < 231 and 0 < K < 10000) 算是最简单的数位dp了.k在这里是10000.三维数组都开不开.可是想想会发现A,B最多有10位,各位数字之和不会超过90.那么当 k >= 90时,就不用dp,由于个位数字之和对k取…
题目链接: Lightoj  1044 - Palindrome Partitioning 题目描述: 给一个字符串,问至少分割多少次?分割出来的子串都是回文串. 解题思路: 先把给定串的所有子串是不是回文串处理出来,然后用dp[i] 表示 从起点到串i的位置的最少分割次数,然后结合处理出来的回文串转移一下即可! 还是好蠢哦!自己竟然感觉是一个区间DP,但是n又那么大,完全不是区间DP的作风啊! #include <cmath> #include <cstdio> #include…
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1084 题解:不妨设dp[i] 表示考虑到第i个点时最少有几组那么 if a[i]-a[i-j]<=2*k (j>=2) then dp[i]=min(dp[i],dp[i-j]+1).所以先要排序,然后用二分找到最小的j然后用线段树或者其他的方法查询(i-1~i-j)的最小值. #include <iostream> #include <cstring&g…
You are x N grid. Each cell of the cave can contain any amount of gold. Initially you are . Now each turn you sided dice. If you get X in the dice after throwing, you add X to your position and collect all the gold from the new position. If your new…
题目链接:http://lightoj.com/volume_showproblem.php?problem=1027 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int sum,ans,n,m; int Gcd(int a,int b){ ) return b; return Gcd(b,a%b); } int…
借鉴自:https://www.cnblogs.com/keyboarder-zsq/p/6216762.html 题意:n个格子,每个格子有一个值.从1开始,每次扔6个面的骰子,扔出几点就往前几步,然后把那个格子的金子拿走: 如果扔出的骰子+所在位置>n,就重新扔,直到在n: 问取走这些值的期望值是多少 解析: [1] [2] [3][4] [5] [6] [7] [8] [9] //格子和值都是一样,所以下述的话,值就是格子,格子就是值... 比如这样的9个格子,我们总底往上来 对于第9个格…
You are in a cave, a long cave! The cave can be represented by a 1 x N grid. Each cell of the cave can contain any amount of gold. Initially you are in position 1. Now each turn you throw a perfect 6 sided dice. If you get X in the dice after throwin…
题意: 给出a,b求区间a,b内写下过多少个零 题解:计数问题一般都会牵扯到数位DP,DP我写的少,这道当作入门了,DFS写法有固定的模板可套用 dp[p][count] 代表在p位 且前面出现过count个零的方案数 /** @Date : 2016-10-27-17.26 * @Author : Lweleth (SoungEarlf@gmail.com) * @Link : * @Version : $ */ #include <stdio.h> #include <iostrea…
思路:状态DP dp[i]=2*dp[i-1]+dp[i-3] 代码如下: 求出循环节部分 1 #include<stdio.h> 2 #define m 10007 3 int p[m]; 4 int main() 5 { 6 p[0]=p[1]=1;p[2]=2; 7 for(int i=3;i<m;i++){ 8 p[i]=2*p[i-1]+p[i-3]; 9 p[i]%=m; 10 } 11 int t,ca=0,n; 12 scanf("%d",&t…
题意: 给你n天分别要穿的衣服种类,可以套着穿, 一旦脱下来就不能再穿,求n天至少要几件. 思路: 区间DP dp[i][j]代表i到j需要至少几件衣服 第i天的衣服在第i天穿上了,dp[i][j]=dp[i+1][j]+1, 枚举区间(i,j],如果有第k天的衣服=第i天的,考虑第i件衣服在在第i天没穿(因为穿上了,第k天还需要穿么?)dp[i][j]=dp[i+1,k-1]+dp[k,j]: #include <bits/stdc++.h> using namespace std; typ…
题意: 给出一个word,求有多少种方法你从这个word清除一些字符而达到一个回文串. 思路: 区间问题,还是区间DP: 我判断小的区间有多少,然后往外扩大一点. dp[i,j]就代表从i到j的方案数. 状态转移: 其实对于在任意区间[i ,j],都可以, 在子区间[i+1,j]中可以直接去掉s[j]时,顺便去掉s[i],所以就有它的方案, 在子区间[i,j-1]中可以直接去掉s[i]时,顺便去掉s[j],所以就有它的方案, 但是s[i],s[j]不相等的时候 dp[i+1,j],dp[i,j-…
题意: 给你一个长度<=100的字符串. 然后你可以在任何位置插入字符,问最少插入几个构成回文. 思路: 1.长度-LCS: 2.区间DP; 我保证小的区间是一个回文,然后枚举区间,构成大区间,就是很简单的区间dp dp[i,j]代表从i->j的最少数量. 然后扩大,就好了吧. 如果区间的两端是相同:dp[i,j]=dp[i+1,j-1]的大小. 然后倒着枚举起点,然后区间大小慢慢扩大,然后总的区间越来越大.就是这样. code---.. #include<bits/stdc++.h&g…
An integer is divisible by 3 if the sum of its digits is also divisible by 3. For example, 3702 is divisible by 3 and 12 (3+7+0+2) is also divisible by 3. This property also holds for the integer 9. In this problem, we will investigate this property…
链接: https://vjudge.net/problem/LightOJ-1299 题意: 考虑成,U位置的点要往后放,D位置往前放 Dp[i][j]表示处于i位置,还有j个U没有放下. s[i] == 'D' : Dp[i][j] = Dp[i-1][j]j+Dp[i-1][j+1](j+1) 把d放到前面空出来j的位置中的一个,或者是j+1中的一个同时j+1中的一个U再放下来. s[i] == 'U' : Dp[i][j] = Dp[i-1][j-1]+Dp[i-1][j]*j 拿起当前…
题意: 给你一个n,再给你n个数,每个数<1e4; 有两个player交替取数字,每个人每一次能拿一个或多个,交替在两边拿. 游戏终止在所有的数字被取完. 两个人的分数就是所取得的数字大小总和. 注意点,两个人每次都是往自己的方向最优. 然后A先拿,问A最大能比B拿多少. 思路: 没思路啊,看题解也是一知半解....…
Investigation LightOJ - 1068 常规数位dp题,对于不同k分开记忆化.注意:k大于82(1999999999的数位和)时不会有答案,直接输出0即可.还有,按照这种记录不同k时的答案的做法需要卡一下空间. 错误1次原因:没有卡空间 #include<cstdio> #include<cstring> ][][][]; int a,b,k,T,TT; ]; int dp(int pos,int r,int sum,bool pre0,bool limit) {…
A.angry_birds_again_and_again 简单积分: http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2877 给定曲线,给定一个点,求从曲线上某点到x轴上某点直线恰为曲线切线和曲线围成的面积. 水题,求积分做就好了,但是开始还错了,回车竟然判成WR而不是PR,第一题就卡,醉了... #include<cstdio> #include<cstring> #incl…
http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.com/ziyi--caolu/p/3236035.html http://blog.csdn.net/hcbbt/article/details/15478095 dp[i][j]为第i天到第j天要穿的最少衣服,考虑第i天,如果后面的[i+1, j]天的衣服不要管,那么dp[i][j] = dp[i…
题目链接:http://lightoj.com/volume_showproblem.php?problem=1298 题意:给你两个数 n, p,表示一个数是由前 k 个素数组成的,共有 n 个素数,然后求这样的所有的数的欧拉和: 例如 n = 3, p=2; 前两个素数是2,3, 然后因为n=3,所以要再选一个素数组成一个数,有两种选择2*3*2=12 和 2*3*3=18 结果就是Φ(12)+Φ(18) = 10; 我们可以用dp[i][j] 表示前 j 个素数中选择 i 个的结果,Φ[n…
题目链接:http://lightoj.com/volume_showproblem.php?problem=1172 题意:一个n进制(2<=n<=6)的数字,满足以下条件:(1)至少包含两位且不以0开头,比如012是不行的:(2)相邻数字不同:(3)定义这个数字x的score(x)等于相邻数字差的平方和,比如score(125)=(1-2)*(1-2)+(2-5)*(2-5)=10.现在给出n和m,求满足条件的所有n进制的数字中有多少数字的score为m.(1<=m<=10^9…
题意:给你n天需要穿的衣服的样式,每次可以套着穿衣服,脱掉的衣服就不能再穿了,问至少要带多少条衣服才能参加所有宴会 思路:dp[i][j]代表i-j天最少要带的衣服 从后向前dp 区间从大到小 更新dp[i][j]时有两种情况 考虑第i天穿的衣服 1:第i天穿的衣服在之后不再穿了 那么 dp[i][j]=dp[i+1][j]+1; 2:第i天穿的衣服与i+1到j的某一天共用,那么dp[i][j]=min(dp[i][j],dp[i+1][k-1],dp[k][j]),前提是第i天和第k天需要的礼…
题目链接:http://lightoj.com/volume_showproblem.php?problem=1036 #include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include <algorithm> #include <queue> #include <vector> using namespace std; ;…
题目链接:http://lightoj.com/volume_showproblem.php?problem=1033 #include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include <algorithm> #include <queue> #include <vector> using namespace std; ;…
题目链接: http://lightoj.com/volume_showproblem.php?problem=1031 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; ; int dp[maxn][maxn]; //dp[i][j] 表示先手从i到j比后手多的分差. int sum[maxn],a[maxn]; in…