02 2014 档案
摘要:刚看到这个题目不知道怎么个DP法,有点难想到解法如下设置dp[i][j]代表i到j这段子序列能获得的最大值,这样,枚举m=min(m,dp[i+1到j][j],dp[i][i到j-1]),m就代表了给另一个人的,就可求得就只能取到 dp[i][j]-sum(i,j)-m,这样,sum为该段序列总和,只需简单的数列前缀和即可求得sum,这样,只需枚举m值,不断向下进行记忆化搜索,即可求得终结果。#include #include #include using namespace std;int n;int dp[110][110];int vis[110][110];int s[110];int
阅读全文
摘要:就是经典约瑟夫环问题的裸题我一开始一直没理解这个递推是怎么来的,后来终于理解了假设问题是从n个人编号分别为0...n-1,取第k个,则第k个人编号为k-1的淘汰,剩下的编号为 0,1,2,3...k-2,k,k+1,k+2...此时因为从刚刚淘汰那个人的下一个开始数起,因此重新编号把k号设置为0,则k 0k+1 1...0 n-k1 n-k+1假设已经求得了n-1个人情况下的最终胜利者保存在f[n-1]中,则毫无疑问,该胜利者还原到原来的真正编号即为 (f[n-1]+k)%n (因为第二轮重新编号的时候,相当于把每个人的编号都减了k,因此重新+k即可恢复到原来编号)。由此,我们可以想象,当最.
阅读全文
摘要:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3735好久没做DP题了,一开始没理解题目里的C(M,3)是干什么,原来就是组合,C M 取3,就等于n*(n-1)*(n-2)/6;题目里还有一个细节是说电脑玩家是要一个接着一个打败,这样,规划方向也确定了,设dp[i][j]为当前打败了Ai电脑,并且阵容为j的概率最大值,dp[i][j]=max(dp[i][j],dp[i-1][j]*p[j][no[i]]) ,p[][]为对应的概率,no[]为电脑编号此外因为某个人可以在打败某个电脑之后变成该电脑的阵容,因此又能得到
阅读全文
摘要:题意很简单,在一串正整数序列中找一个连续的子序列使该序列和大于等于一个已知量S,但要求序列长度最短,通常喜欢暴力枚举这个题目跟大白书之前的一个题目很像,在数列A中 求 Ai-Aj最大 并且 i=S,则不断增加i,否则,就增加j。这样只是枚举了一下终点,而找到起点几乎是常数时间。#include #include #include using namespace std;int num[100010];int B[100010];int main(){ int n,s; while (scanf("%d%d",&n,&s)!=EOF) { for (int i
阅读全文
摘要:这是大白书上的例题,刘汝佳的解题方法很巧妙。要把初始盘子移到最终状态,先把最大的盘子安置好,否则无法成功,所以先找到最大的没在最终柱的盘子,先移到该盘子所在柱子上只有该盘子,并且其他盘子都在中转柱上(已经进入最终柱的最大盘子不考虑了),通过一个递归解得到该状态的步数,然后放完该盘子之后,就变成了一个柱子上放剩余盘子,由底向上把剩余的盘子按终态放好,需要用到汉诺塔的一个已知结论就是把一个汉诺塔的所有盘子从一个柱子移到另一个柱子上,需要用2的n次方-1步。#include #include #include #define ll long longusing namespace std;int n
阅读全文

浙公网安备 33010602011771号