hihocoder #1300 : 展胜地的鲤鱼旗 dp】的更多相关文章

题目链接: http://hihocoder.com/problemset/problem/1300 题解: 先用栈预处理出每个‘)’匹配的‘(’的位子,放在pos数组中. dp[i]表示以i结尾的合法子串个数,则易知转移方程: dp[i]=dp[pos[i]-1]+1: 代码: #include<iostream> #include<cstdio> #include<stack> using namespace std; typedef long long LL; ;…
题目链接:http://hihocoder.com/problemset/problem/1300 给一个字符串,只包含'('和')',问存在多少个子串似的括号是匹配的. 匹配规则在题干中描(蒻)述(语)得(文)非常烂! 维护一个栈,栈中保存'('的下标.当遇到')'并且栈非空的时候,说明已经匹配到一对括号.取出栈顶'('的位置idx.并且记录此时状态,dp(i)=dp(idx-1)+1. #include <algorithm> #include <iostream> #incl…
http://hihocoder.com/problemset/problem/1044 可以看出来每一位的选取只与前m位有关,我们把每个位置起始的前m位选取状态看出01序列,就可以作为一个数字来存储,那么将其作为状态,dp[i][j]就是第i个座位前m个座位选取情况为j的最大垃圾处理量.然后取这个序列的后m-1位,和当前位取0/1的情况分别做合法性判断,然后做状态转移即可. #include <iostream> using namespace std; ; ; ]; int n,m,q;…
#1301 : 筑地市场 题目连接: http://hihocoder.com/problemset/problem/1301 Description 筑地市场是位于日本东京都中央区筑地的公营批发市场,为东京都政府设置的中央批发市场之一,亦是日本最大的鱼市场.其规模之大与知名度之广,不只是东京,更是日本首屈一指的批发市场.全球百分之五十的金枪鱼,从世界的各地被运往这里,在每天的清晨,进行着繁忙的拍卖,它们是寿司中最不可或缺的食材,如何能够买到上等的金枪鱼,成为了每家寿司店都关注的大事. 当地的鱼…
http://hihocoder.com/problemset/problem/1496 题意:中文. 思路:一开始做有一种想法,把所有的数都变成二进制后,最优的情况肯定是挑选所有数中最高位的1能同时有一个以上的数. 例如样例2可以化成: 001 010 100 101 那么肯定挑选最高位的1(第三位)并且有一个以上的数更优,如果没有一个以上那么与之后会变成0. 那么对于这一位应该如何挑选. 一开始想着只挑选最大的两个,但是造出下面的样例: 1001000 1000110 1000110 这样的…
思路:状态压缩,dp(i, j)表示考虑前i个数且[i-m+1, i]的选择情况为j.如果要选择当前这个数并且,数位1的个数不超过q,则dp[i+1][nex] = max(dp[i+1][nex], dp[i][j] + w[i+1]),如果不选择dp[i+1][j>>1] = max(dp[i+1][j>>1], dp[i][j]); AC代码 #include <cstdio> #include <cmath> #include <cctype&…
题意:合并石子,每次只能合并l~r堆成1堆,代价是新石堆石子个数,问最后能不能合成1堆,不能输出0,能输出最小代价 思路:dp[l][r][t]表示把l到r的石堆合并成t需要的最小代价. 当t == 1时,dp[i][j][1] = min(dp[i][j][1], dp[i][k][t] + dp[k + 1][j][1] + sum[j] - sum[i - 1]),其中t属于[l - 1, r - 1] 当t >= 2时,dp[i][j][t] = min(dp[i][j][t], dp[…
Sample Input 6 1212 Sample Output 298 给定一个数字字符串S,如果一个数字字符串(只包含0-9,可以有前导0)中出现且只出现1次S,我们就称这个字符串是好的. 例如假设S=666,则1666.03660666是好的,6666.66.123不是好的:假设S=1212,则01212.12123是好的,121212.121是不好的. 请你计算长度为N的数字字符串中,有多少个是好的.由于总数可能很大,你只需要输出总数模1000000007的余数. Input 一个整数…
题解: 比较水的题目 dp[i][j]表示[i...j]最少改变几次变成回文字符串 那么有三种转移 dp[i][j] = dp[i+1][j-1] + s[i] != s[j] dp[i][j] = dp[i+1][j] + 1(删除左边的字符,或者在右边添加一个字符与左边匹配) dp[i][j] = dp[i][j-1] + 1(删除右边的字符,或者在左边添加一个字符与右边匹配) #include <iostream> #include <cstring> #include &l…
有n堆石子,每次你可以把相邻的最少L堆,最多R堆合并成一堆. 问把所有石子合并成一堆石子的最少花费是多少. 如果不能合并,输出0. 石子合并的变种问题. 用dp[l][r][k]表示将 l 到 r 之间的石子合并成 k 堆. 显然是k == 1 时,合并才是需要花费代价的.k >= 2时转移的时候不需要加代价. 这个我当时非常不理解.然后后来想想确实是这样的.因为k >= 2的状态必然是由 k == 1的时候转移过来的. 就是说将[l, r]分成k堆,必然要有几堆合并成一堆. 同理,合并区间长…