摘要:
本题的题眼很明显,N (1 <= N <= 150), M (1 <= M <= 10),摆明了是想让你用状态压缩dp。 整个思路如下:由于要填2*3或者3*2的芯片,那么就要找一个策略来判断到底能不能填。 精华1在此: 找到的策略是,记格子(i,j)的状态有三种: 状态0代表(i,j)和(i-1, 阅读全文
摘要:
直接上状态转移方程: 记dp[i][j]为第i轮比赛,第j个队伍获胜的概率。 那么初始状态下,dp[0][j]=1;//也就是第0轮比赛全都获胜 d[i][j]=sum(d[i-1][j]*d[i-1][k]*win[j][k])//也就是找到所有可能与j队在第i轮对决的k队,那么i队战胜k队的概率 阅读全文
摘要:
错排问题本质上就是一个动态规划问题,其状态转移方程为: 记d[n]为n个人错排情况的总数。 那么策略可以描述为:分析第n个人错排的可能情况: 1)前n-1个人满足错排的情况,那么第n个人加入后还要错排意味着第n个人与前n-1个人里的任意一个交换字条(共有n-1种交换法) 2)若前n-1个人并不满足错 阅读全文
摘要:
这题做的心塞。。。 整个思路非常清晰,d[i][0]表示第i个结点不设置监察的情况下至少需要的数量;d[i][1]表示第i个结点设置检查的情况下的最小需要的数量。 状态转移方程见代码。 但是万万没想到的是,在实现过程中修改了4遍代码,wa了若干次才AC。。。。 下面来总结一下各种wa代码: 版本1: 阅读全文
摘要:
本题求一个字符串中的最长递增子序列的长度。 动态规划方程 a[]记录字符串; d[i]记录以第i个元素为最后一个元素的最长递增序列的长度 则 d[i+1]=1+max(d[j]) 其中(j<i+1)并且a[j]<a[i+1]。 这样的话,没更新一个d[i+1],都需要搜索一遍前i项,因而此时复杂度为 阅读全文
摘要:
题意是说,给定一个字符串,问至少还需要插入多少个字符才能使得该字符串成为回文字符串。 这道题一开始做的时候用了一个简单的动态规划,开了一个5000*5000的数组,用递归形式实现,代码如下: 其中d[i][j]表示i到j所需要插入的字符数。然而数组开得太大直接报MLE。因此想到用滚动数组来解决。 M 阅读全文
摘要:
此题经典线性动态规划。 代码如下: 阅读全文
摘要:
最大子序列和的加强版。 借助最大子序列和,分别正向和反向遍历一遍得到left和right数组(具体含义见代码注释) 然后再对left和right数组进行修正,保存从对应元素起向左或向右的最大连续和。 最后再次遍历一遍得到最大的ans。 AC代码如下: 阅读全文
摘要:
思路就是先将每个单词存进二叉树中,没出现一次,修改该单词所在结点的cnt++; 最后通过递归中序遍历输出结果。 思路很清晰,主要注意一下指针的使用,想一想为什么要这么用? 简单的解释就是,insert函数修改的是指针的属性而不是指针指向的目标地址内容的属性。 代码: 阅读全文
摘要:
由于题面中给定的wall最大长度为10 000 000;若简单用线段树势必会超时。 而注意到题面中规定了输入海报的个数<=1000;因此不妨离散化,使得线段中叶节点仅含有1000个,那么线段最大深度为10,不会TLE。 同时在构造线段树的时候除了设置基本的长度变量l,r之外, 设置了一个新的变量ki 阅读全文