动态规划
文章平均质量分 52
Edwards_June
Just For My Interest
展开
-
最短编辑距离2
传统的编辑距离里面有三种操作,即增、删、改,我们现在要讨论的编辑距离只允许两种操作,即增加一个字符、删除一个字符。我们求两个字符串的这种编辑距离,即把一个字符串变成另外一个字符串的最少操作次数。假定每个字符串长度不超过1000,只有大写英文字母组成。#define N 100/* * dp[i][j]表示源串source[0-i)变化为目标串target[0-j)最短操作次数 * */原创 2017-01-14 19:49:53 · 436 阅读 · 0 评论 -
最长公共子序列
什么是最长公共子序列呢?好比一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则S 称为已知序列的最长公共子序列。举个例子,如:有两条随机序列,如 1 3 4 5 5 ,and 2 4 5 5 7 6,则它们的最长公共子序列便是:4 5 5。提示:最容易想到的算法是穷举搜索法,但考虑到最长公共子序列问题也有最优子结构性质,可以用动态规划解决。#defi原创 2017-01-16 11:27:42 · 553 阅读 · 0 评论 -
交替字符串
输入三个字符串s1、s2和s3,判断第三个字符串s3是否由前两个字符串s1和s2交错而成,即不改变s1和s2中各个字符原有的相对顺序,例如当s1 = “aabcc”,s2 = “dbbca”,s3 = “aadbbcbcac”时,则输出true,但如果s3=“accabdbbca”,则输出false。#define N 100bool isInterLeave(string a, stri原创 2017-01-16 11:26:57 · 670 阅读 · 0 评论 -
格子取数3
给定m*n的矩阵,每个位置是一个整数,从左上角开始,每次只能朝右、上和下走,并且不允许两次进入同一个格子,走到右上角,最小和。#include using namespace std;#define M 4#define N 4int dp[M][N];void initDp() { for (int i = 0; i < M; ++i) { for (int j = 0原创 2017-01-16 11:26:33 · 546 阅读 · 0 评论 -
格子取数2
给定m*n的矩阵,每个位置是一个非负整数,从左上角开始,每次只能朝右和下走,走到右下角,但只走一次,求总和最小的路径。#define N 4int dp[2][N];bool isVaild(int step, int x, int n) { if (x >= 0 && x = 0 && step - x < n) { return true; } return false;原创 2017-01-16 11:26:05 · 366 阅读 · 0 评论 -
格子取数问题
有n*n个格子,每个格子里有正数或者0,从最左上角往最右下角走,只能向下和向右,一共走两次(即从左上角走到右下角走两趟),把所有经过的格子的数加起来,求最大值SUM,且两次如果经过同一个格子,则最后总和SUM中该格子的计数只加一次。#define N 6//使用滚动数组,因为每次状态计算只要用到前一次的记录即可int dp[2][N][N] = { 0 };/*坐标是否满足要求*/原创 2017-01-16 11:25:29 · 621 阅读 · 0 评论 -
有一亿个数,输入一个数,找出与它编辑距离在3以内的数,比如输入6(0110),找出0010等数,数是32位的。
#define LIMIT 3//计算二进制中1个数int find1NumsInBin(int num) { int count = 0; while (num) { num = num & (num - 1); count++; } return count;}bool isVaild(int n) { int count = 0; while (n) {原创 2017-01-15 12:09:47 · 735 阅读 · 0 评论 -
字符串编辑距离
给定一个源串和目标串,能够对源串进行如下操作:在给定位置上插入一个字符替换任意字符删除任意字符写一个程序,返回最小操作数,使得对源串进行这些操作后等于目标串,源串和目标串的长度都小于2000。#define N 100/* * dp[i][j]表示源串source[0-i)变化为目标串target[0-j)最短操作次数 * */int EditDistance(strin原创 2017-01-15 12:08:52 · 515 阅读 · 1 评论 -
最长递增子序列
给定一个长度为N的数组a0,a1,a2...,an-1,找出一个最长的单调递增子序列(注:递增的意思是对于任意的i提示:一种解法是转换为最长公共子序列问题,另外一种解法则是动态规划。当我们考虑动态规划解决时,可以定义dp[i]为以ai为末尾的最长递增子序列的长度,故以ai结尾的递增子序列要么是只包含ai的子序列要么是在满足j如此,便可建立递推关系,在O(N^2)时间内解决这个问题。原创 2017-01-14 20:19:03 · 340 阅读 · 0 评论 -
数塔取数问题
int getTowerMax(int* arr, int len, int floor) { int* dp = new int[len + 1]; memset(dp, 0, sizeof(int) * len); for (int i = len - floor; i < len; ++i) { dp[i] = arr[i]; } //自底向上 for (int i =原创 2017-01-14 20:15:02 · 430 阅读 · 0 评论 -
子序列个数
子序列的定义:对于一个序列a=a[1],a[2],......a[n],则非空序列a'=a[p1],a[p2]......a[pm]为a的一个子序列其中1对于给出序列a,有些子序列可能是相同的,这里只算做1个。要求输出a的不同子序列的数量。#define MAXN 1000005#define MOD 1000000007int subquense(int* ar原创 2017-01-14 20:13:44 · 458 阅读 · 0 评论 -
木块砌墙
用 1×1×1, 1×2×1以及2×1×1的三种木块(横绿竖蓝,且绿蓝长度均为2),搭建高长宽分别为K × 2^N × 1的墙,不能翻转、旋转(其中,0有多少种方案,输出结果对1000000007取模。举个例子如给定高度和长度:N=1 K=2,则答案是7,即有7种搭法。#ifdef WIN32#define ll __int64#else#define l原创 2017-01-16 11:28:12 · 385 阅读 · 0 评论