hdu 4455 动态规划】的更多相关文章

思路:用sum[i]表示区间长度为i的不相同数的个数和,假使所有的数都不相同,那么sum[i]=sum[i-1]+n-i+1-later[i-1]; later[i-1]表示的是序列最后面的长度为i-1的序列不同数的个数.这个式子的意义是每个长度为i-1的序列扩展为长度为i的序列,其不同数的个数会加1,一共有n-i+1个长度为i-1的序列能扩展,因为最后面的一个长度为i-1的序列肯定是扩展不了的(后面没数了),故要将最后面的长度为i-1的序列减去,即减later[i-1]. 那么对存在相同数的情…
题目链接:hdu 4455 Substrings 题目大意:给出n,然后是n个数a[1] ~ a[n], 然后是q次询问,每次询问给出w, 将数列a[i]分成若干个连续且元素数量为w的集合,计算每个集合中出现的数字种类,输出总和. 解题思路:一开始想到遍历的算法,保持集合元素为w,每次剔除最前一个,加入一个,移动集合,维护数字种类,这种算法的复杂度为o(n^2), 但是超时了,后来看了下题解,dp[i] = dp[i - 1] + sum[i] - cnt; http://blog.csdn.n…
http://acm.hdu.edu.cn/showproblem.php?pid=1087 Online Judge Online Exercise Online Teaching Online Contests Exercise Author F.A.QHand In HandOnline Acmers Forum |DiscussStatistical Charts Problem ArchiveRealtime Judge StatusAuthors Ranklist       C/C…
http://acm.hdu.edu.cn/showproblem.php?pid=4455 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4384 题目大意就不多说了,官方的解法是dp,没太理解,自己想了一个直接点的方法,O(n). 既然要计算所有贡献和,对于区间长度为k,假设集合中的元素全都相同,那么这个元素将会贡献给所…
Substrings Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3240    Accepted Submission(s): 990 Problem Description XXX has an array of length n. XXX wants to know that, for a given w, what is t…
http://acm.hdu.edu.cn/showproblem.php?pid=1003 这几天开始刷动归题目,先来一道签到题 然而做的并不轻松, 没有注意到边界问题, WA了几发才发现 #include<iostream> #include<cstdio> #include<cstring> using namespace std; ]; ]; int main() { ,num=,shit; scanf("%d",&test);shi…
hdu 4055: 一开始我想的递推方向想得很复杂,看了别人的博客后才醍醐灌顶: 参照他的思路和代码: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; ; char s[N]; int dp[N][N], sum[N][N]; int main() { )) { memset(dp,,sizeof(dp)); // memset(sum,0,sizeof(sum)…
思路:特水的一个最长回文子序列动态规划.比赛时硬卡第一题,49WA后终于AC,可惜没时间做这题,结果成绩也就可想而知了.兔子跳一样权值的石头,并且一个正跳,一个反跳,这不就是个回文子序列吗?????!!!! #include<set> #include<map> #include<cmath> #include<queue> #include<cstdio> #include<vector> #include<string>…
思路:其实这题是个挺水的动态规划,一开始就能AC,可是不知道错哪了,瞎改瞎交,WA了数十次.AC之后怎么改都是AC,也不知道改了什么地方,郁闷死了~~~难道开始时的测试数据有问题??? dp[i][j]表示第i天在第j个地方的最大概率,那么dp[i][j]=max(dp[i][j],dp[i-1][k]+p[k][j]+we[i][weh[j]]); p[k][j]表示从k到j的概率,we[i][j]表示第i个地方出现j天气的概率. #include<iostream> #include<…
题意:给定一个序列ai,个数为n.再给出一系列w:对于每个w,求序列中,所有长度为w的连续子串中的权值和,子串权值为子串中不同数的个数. 思路:动态规划,用dp[w]表示当前长度为w的时候的权值和.显然dp[1] = n; 如果求dp[2]的话,那么它可以由dp[1]推出来,首先它比dp[1]少了最后一个子序列,那么最后一个子序列的权值用num来表示,num[i]从后面开始数i位的权值,也就是不同的个数.然后在计算每个子序列多了一个多元素多增加的权值,这里用sum[i]表示长度两个相同元素最近距…