随笔分类 -  算法_动态规划

动态规划____装配线 两行并行,区分状态转移方向
摘要:1.long long 使用 %lld读&写2.两行并行的DP(两行之中每一个状态的状态转移方向不同[虽然类似]),所以要写两个转移函数3.需要注意的代码:int f1(int index){ if(dp1[index] != INF) return dp1[index] ; if(index == 1)//不要想当然的把结尾当作0 return dp1[index] = time1[0] + time1[1];//结尾处不仅要加time1[0],也要加time1[1] else return dp1[index] = min( f1(index-... 阅读全文
posted @ 2013-07-04 16:38 wwjyt 阅读(238) 评论(0) 推荐(0)
动态规划____有重叠子问题的搜索,都可以转为记忆化搜索
摘要:1.细节还是挺重要的,m n一定别写错2.用INF标记未访问的点的方法 确实不错3.如题:有重叠子问题的搜索,都可以转为记忆化搜索#include #include #include #include #define INF 0#define MAX 110using namespace std;int input[MAX][MAX];int dp[MAX][MAX];int m, n;int max(int a, int b){ return a>b?a:b;}int d(int i , int j){ if(dp[i][j] != INF) return dp[i... 阅读全文
posted @ 2013-07-03 16:01 wwjyt 阅读(244) 评论(0) 推荐(0)
动态规划____数塔 递推方法(以前都是记忆化搜索)
摘要:比较值得说的是 如果脑子里确实有很明确的递推图(注意是图,根据递推式演变来的二维矩阵(也许三维),或者一维的"类"有向图)那么递推写起来快得多。否则还是记忆化搜索保险。1.但是跟所有动规问题类似,务必注意边界,建议把第一条横边(i = 0 0int input[1010][1010];int map[1010][1010];int min(int a, int b){ return a<b?a:b;}int main(){ int N; int i, j; while(scanf("%d", &N) == 1) { for(i = 0; i 阅读全文
posted @ 2013-07-02 23:54 wwjyt 阅读(265) 评论(0) 推荐(0)
动态规划___记录路径的最长递增子序列
摘要:对比前一篇 背包问题看。此篇特别注意的是 状态转移的范围 (与 状态转移的条件) line31 & 33以及 每一个状态的初值处理,并利用这个初值 处理递归最后一层的情况 line30 1 #include 2 #include 3 #include 4 #include 5 #include 6 7 using namespace std; 8 9 #define MAX 11010 #define INF -111 12 int height[MAX];13 int map[MAX];14 int N;15 stack s; 16 17 int max(int a, i... 阅读全文
posted @ 2013-06-30 22:00 wwjyt 阅读(472) 评论(0) 推荐(0)
动态规划____背包(有容量 物品无限制)
摘要:此类问题的重点是 "状态转移",比如当前背包容量为300,我可以拿10,拿20,拿30.所以 在当前状态下如果我拿10了,状态就转移到290(300-10);拿20了,状态就转移到280(300-20);拿30亦然.而每一个状态的int值 记录了该状态的 最大/小 的目的值.当然,状态的转移有一定的限制条件,只能转移到可以转移的状态.(比如当前背包容量20,就不能拿30的了)状态的转移也有一定范围#include #include #include #define MAX 100010#define INF -1int money, kind;int value[MAX], 阅读全文
posted @ 2013-06-30 17:11 wwjyt 阅读(374) 评论(0) 推荐(0)
动态规划____类数字三角形
摘要:一个由n行数字组成的三角形,第i行有2i-1个正整数(小于等于1000),如下:37 1 42 4 3 6 28 5 2 9 3 6 2要求你用笔从第1行画到第n(0 #include #include #define MAX 300 //开100不行了!#define INF -1int map[MAX][MAX];int in[MAX][MAX];int line;int m(int a, int b, int c){ return a>b?(a>c?a:c):(b>c?b:c);}int dp(int i, int j){ if(map[i][j] != INF) .. 阅读全文
posted @ 2013-06-28 21:10 wwjyt 阅读(285) 评论(0) 推荐(0)
动态规划____编辑距离
摘要:#include #include #define INF -1#define MAX 1010int map[MAX][MAX];char a[MAX], b[MAX];int min(int a, int b, int c){ return a }int dif(int i, int j){ if( a[i-1] == b[j-1]) //注意图的第0行 or 第0列表示什么 算法概论P180图6-4 return 0; else return 1;}int dp(int i, int j){ if( map[i][j] != INF) ... 阅读全文
posted @ 2013-06-28 20:26 wwjyt 阅读(240) 评论(0) 推荐(0)