随笔分类 -  动态规划

摘要:/*记忆化搜索,每次遍历到该位置,先把他能够遍历的邻点遍历完,直到不能遍历为止,然后选择四个可走的邻接点的最值,利用数组记录当前位置的最优值,若遇到已经遍历过的位置时,直接返回该位置的最优值,完成该次递归*/#include <iostream>#include <cstring>#include <cstdio>using namespace std;#define X 102int map[X][X],dp[X][X],n,m;int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; //状态偏移量int f(int x, 阅读全文
posted @ 2012-02-29 22:29 yejinru 阅读(134) 评论(0) 推荐(0) 编辑
摘要:题目:纯粹最长上升子序列(lis:Longest Increasing Subsequence)状态转移方程(时间复杂度为O(n*n)) if(a[i]<a[j])dp[i]=Max(dp[i],dp[j]+1);解一:根据状态转移方程:if(a[i]<a[j])dp[i]=Max(dp[i],dp[j]+1);#include <iostream>#include <cstring>using namespace std;#define X 1003int dp[X];int a[X];int Max(int a,int b){return a>b? 阅读全文
posted @ 2012-02-29 22:29 yejinru 阅读(181) 评论(0) 推荐(0) 编辑
摘要:/*题目: 求最大子矩阵的和分析: 我的做法: 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 我们可以按每一行计算从j开始到k结束的该段和,用dp[i][j][k] 表示第i行的元素从下标j开始到k结束的和,把每一行的都求出, 从而转化为求每一列的最大子序和,本例中, 先求dp[0][0][0] = a[0][0],dp[0][0][1] = a[0][0]+a[0][1],... 从而求完n行,时间复杂度为O(n*n*n),然后每一列dp根据一维最大 子序列和来计算,算出最大的和即... 阅读全文
posted @ 2012-02-29 22:28 yejinru 阅读(260) 评论(0) 推荐(0) 编辑
摘要:参考别人的程序后弄明白了,看来我还是很菜啊==!别人:状态定义为dp[i],在i之前要达到合法message需要删除的最少的字符数,转移的时候是dp[i-1]+1和dp[i-(能匹配的字典串的长度+需要删除的字符串的长度)]+需要删除的字符串的长度。自己:定义状态为dp[i],dp[i]为i前的单词最少要删除的字母数,当i=i+1时,判断target[i]==word[j][word[j].size()-1]是否相等,即判断该单词与字典中的单词的最后一位是否匹配,匹配的话往前算算是否该字典中的单词全部出现在要求匹配单词中,如果是并且该dp小于dp[i]+1的话,转移!转移方程为:dp[i]=m 阅读全文
posted @ 2012-02-29 22:28 yejinru 阅读(126) 评论(0) 推荐(0) 编辑
摘要:矩阵链乘法:矩阵P={}标准模板:for(int i=2;i<=n;i++)for(int j=1;j<=n-i+1;j++){int temp = i+j-1;dp[j][temp] = 1000000000;for(int k=j;k<=temp-1;k++){v = dp[j][k]+dp[k+1][temp]+p[j-1]*p[k]*p[temp];if(v<dp[j][temp]){dp[j][temp] = v;s[j][temp] = k;}}}相乘次数(答案) = dp[1][n]打印最佳链乘表达式:void print(int i,int j){if( 阅读全文
posted @ 2012-02-29 22:27 yejinru 阅读(188) 评论(0) 推荐(0) 编辑
摘要:莫非就是最长子序列和?#include <iostream> using namespace std;#define X 10002int a[X];int main(){freopen("sum.in","r",stdin);freopen("sum.out","w",stdout);int n;while(cin>>n,n){for(int i=0;i<n;i++)cin>>a[i];int max = -2001;int sum = 0;for(int i=0;i&l 阅读全文
posted @ 2012-02-29 22:26 yejinru 阅读(102) 评论(0) 推荐(0) 编辑
摘要:题目: 动态规划版的硬币交换问题,求用最少的不同价值的硬币总数来换给出的硬币总数,如硬币只有1,6,10时,按贪心算法做就是先给价值为10的硬币,再给两枚价值为1的硬币,总硬币数为3,可是只需要两枚价值为6的硬币即可分析:用dp[i][j]来记录当前的硬币价值总数为j时需要的硬币最小数,i表示从硬币i到n的种类,j表示剩余的未交换的硬币价值总数,则状态转移方程为for(int j=0;j<=n;j++)dp[i][j] = j;dp[i][j] = dp[i+1][j] 当denom[i]>j时= min{dp[i+1][j],dp[i][j-denom[i]]+1}当j>= 阅读全文
posted @ 2012-02-29 22:26 yejinru 阅读(1152) 评论(0) 推荐(0) 编辑
摘要:LCS最长公共子序列模板:状态转移方程为dp[i][j]=dp[i-1][j-1]+1 if(in[i]==target[i])=max{dp[i-1][j],dp[i][j-1]} else;void LCSLength(int m,int n,char *x,char *y,int **c,int **b){ int i,j;for (i = 1; i <= m; i++) c[i][0] = 0;for (i = 1; i <= n; i++) c[0][i] = 0;for (i = 1; i <= m; i++)for (j = 1; j <= n; j++) 阅读全文
posted @ 2012-02-29 22:25 yejinru 阅读(196) 评论(0) 推荐(0) 编辑
摘要:题目:A = {a1,a2...an}函数D(A) = A1+A2;A1 = {as1...at1}A2 = {as2...at2}1<=s1<=t1<=s2<=t2例子:A = {1 -1 2 2 3 -3 4 -4 5 -5}在这个例子中,选择{2,2,3,-3,4} 和 {5},得到答案。分析:最大子序列和,时间复杂度为O(n)int max = 0,current = 0;for(int i=0;i<n;i++){current+=a[i];if(current>max)max = current;if(current<0)current = 阅读全文
posted @ 2012-02-29 22:25 yejinru 阅读(160) 评论(0) 推荐(0) 编辑
摘要:题目:链 AGTGATGGTTAG可变形成AGTGAT-G-GT--TAG从而得到和最大分析:dp问题,属于最长公共子序列的变形题,用二维dp[i][j]存储当前串一的i位置和串二j位置上的和最大值,答案为dp[len1][len2],用地图map[i][j]存储AGCT的匹配程度,把输入的字符串用数组表示,并且a[i][j],b[i][j]与地图的对应更容易计算状态转移方程为dp[i][j]=max{dp[i][j],dp[i][j-1]+map[a[i]][5],dp[i-1][j]+map[5][b[j]],dp[i-1][j-1]+map[a[i]][b[j]]}#include &l 阅读全文
posted @ 2012-02-29 22:24 yejinru 阅读(159) 评论(0) 推荐(0) 编辑
摘要:最长公共子序列状态转移方程为dp[i][j] = dp[i-1][j-1]+1 s1[i]==s[j]= max{dp[i-1][j],dp[i][j-1]} s1[i]!=s2[j]#include <iostream>#include <cstring>#include <string>using namespace std;#define X 255int dp[X][X];string s1,s2;int main(){freopen("sum.in","r",stdin);freopen("sum. 阅读全文
posted @ 2012-02-29 22:20 yejinru 阅读(117) 评论(0) 推荐(0) 编辑
摘要:题目:求最大公共子序列(LCS)分析:用dp做,郁闷,还真有空格出现了,之前用scanf读入WA,改用gets读入A了状态转移方程式为dp[i][j] = dp[i-1][j-1]+1, s1[i]==s2[j]= max{dp[i-1][j],dp[i][j-1]} s1[i]!=s2[j]#include <iostream>#include <cstring>#include <cstdio>using namespace std;#define X 1005char s[X],ch[X];int dp[X][X];int main(){freopen 阅读全文
posted @ 2012-02-29 22:12 yejinru 阅读(108) 评论(0) 推荐(0) 编辑