上一页 1 ··· 3 4 5 6 7 8 9 10 11 ··· 14 下一页
摘要: 考虑对于某行某列元素,row[i][j]表示加上位置为i,j的土豆的质量的i行j列最大的和列的最大值:row[i][j]=max(row[i][j-2]+row[i][j-3])+val看图说话:假设红色的格子为i行j列,那么它的前面有两种选择方案:1、选择蓝色格子2、选择黄色格子那么该行最大的和是什么呢?由于n列、n-1列具有状态无关性(n-1列的状态影响不了n列的状态),很显然等于max(row[i][n],row[i][n-1])同理对于dp[i] (i行的最大值)dp[i]=max(dp[i-2],dp[i-3])+max_row[i]看图说话:max土豆质量=max(dp[m],dp 阅读全文
posted @ 2013-05-08 10:08 小仪在努力~ 阅读(415) 评论(0) 推荐(0) 编辑
摘要: 大神的解题报告:http://hi.baidu.com/newmyl/item/afc7cb0ef6ef5b7dbee97e071、当高度(h)和宽度(w)为奇数时:area=h*w;骨牌面积:2h*w / 2!=0 -> 不能用骨牌覆盖2、记f[i][s1]为第i-1行全满且第i行状态为s1时的种数,f[i-1][s2]为第i-2行全满且第i-1行状态为s2时的种数,则骨牌的覆盖方案数会等于f[h][w<<1-1](第h行全满状态):结论:第i行的放置方案数,取决于第i-1行的放置方案数对于每一个位置,3种放置方案:1. 竖直放置2. 水平放置3. 不放置d为当前列号 ,初 阅读全文
posted @ 2013-05-07 09:05 小仪在努力~ 阅读(302) 评论(0) 推荐(0) 编辑
摘要: o(︶︿︶)o 唉,菜鸟整理出来大神的代码~附加个前向星式建图/*题意: 给出n个字符串, 计算两两比较的次数. 每次比较都需要比较(str1[i] == str2[i])和 (str1[i] == '\0'各一次).点评:将N个字符串插入前缀树,‘\0’也插入,这样就能区分字符串的终结点S1与S2的共同前缀S,则比较次数为len(S)*2+1但S1与S2相同,则比较次数为 (len(S1)+1)*2 (注意:这时连'\0’都算进去了噢~,因为适用性,所以模板最好是用一维的前向星式的*/#include <cstdio>#include <iostre 阅读全文
posted @ 2013-05-06 20:59 小仪在努力~ 阅读(318) 评论(0) 推荐(0) 编辑
摘要: 给出一个由S个不同单词组成的字典和长字符串。把这个字符串分解成若干个单词的连接(单词可以重复使用),有多少种方法?比如,有4个单词a、b、cd、ab,则abcd有两种分解方法:a+b+cd和ab+cd。待分解的字符串:长度L不超过300000单词的个数:1<=S<=4000思路:令d[i]表示从字符i开始的字符串的分解方案数,则d[i]=sum{d[i+len(x)] | 单词x是S[i..L]的前缀)},由它的递推性质可知,只需要从后往前遍历字符串,记录d[i],再累加就是答案动态模板:#include<iostream>#include<cstdio># 阅读全文
posted @ 2013-05-06 09:02 小仪在努力~ 阅读(172) 评论(0) 推荐(0) 编辑
摘要: #include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>#include<string>using namespace std;#define INF 0x80000000int re[15];bool dp[100006];int main(){ int t=1,i,j,k,ans; while(~scanf("%d",&re[1])) { ans=re[1]; for(i=2;i 阅读全文
posted @ 2013-05-04 19:58 小仪在努力~ 阅读(295) 评论(0) 推荐(0) 编辑
摘要: 有点小坑的严格单调递增序列,主要是排序那里坑了一下。思路:矩形的嵌套? (a<c&&b<d)||(a<d&&b<c)? 不,只要在建点时保证a<b,条件就会少一个,直接a<c&&b<d就行了#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>#include<string>using namespace std;str 阅读全文
posted @ 2013-05-04 16:55 小仪在努力~ 阅读(262) 评论(0) 推荐(0) 编辑
摘要: /*第一行:将n划分成若干正整数之和的划分数。状态转移方程:dp[i][j]:和为i、最大数不超过j的拆分数dp[i][j]可以分为两种情况:1、拆分项至少有一个j 2、拆分项一个j也没有dp[i][j]=dp[i-j][[j]+dp[i][j-1]第二行:将n划分成k个正整数之和的划分数。dp[n-k][k]:相当于把k个1从n中拿出来,然后和n-k的拆分项相加的个数第三行:将n划分成若干最大不超过k的正整数之和的划分数。dp[n][k]第四行:将n划分成若干奇正整数之和的划分数。dp1[i][j]是当前的划分数为i,最大值为j时的中的划分数,则状态转移方程为dp1[i][j]=dp1[i] 阅读全文
posted @ 2013-05-04 15:49 小仪在努力~ 阅读(224) 评论(0) 推荐(0) 编辑
摘要: 个人觉得DP最烦的就是确定初始边界,比如说这题,求10^9的数内各个数位相加的和中有多少个数的数位和等于S初始条件:dp[0][j]=1 j=1、2…9状态转移方程:dp[i][j]表示:和为i,不超过j个数相加的符合条件的数有多少个dp[i][j]=sum{dp[i-k][j-1] k=0、1…9}#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>#include<string>using namesp 阅读全文
posted @ 2013-05-04 12:04 小仪在努力~ 阅读(280) 评论(1) 推荐(0) 编辑
摘要: #include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>#include<string>using namespace std;int g[100005][13];//g[i][j]相当于i秒、j位置的饼能被接到的情况下,时间从后往前的接饼最大值int max(int a,int b,int c){ if(a<b) a=b; if(a<c) a=c; return a;}int main(){ in 阅读全文
posted @ 2013-05-03 19:53 小仪在努力~ 阅读(291) 评论(0) 推荐(0) 编辑
摘要: 最长递增递减子序列我的代码:#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>#include<string>using namespace std;struct point { int x,y;}p[1005];int dp[1004];bool cmp(point a,point b){ return a.x>b.x;}int main(){ int t,n,i,j,re[1005]; scan 阅读全文
posted @ 2013-05-03 14:50 小仪在努力~ 阅读(229) 评论(0) 推荐(0) 编辑
上一页 1 ··· 3 4 5 6 7 8 9 10 11 ··· 14 下一页