动态规划(2)
发布日期:2021-11-04 22:04:25
浏览次数:19
分类:技术文章
本文共 1978 字,大约阅读时间需要 6 分钟。
接下来就是一些常见的动态规划题目:
(1)
对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,定义c0,c1,c2分别为三种操作的代价,请设计一个高效算法,求出将A串变为B串所需要的最少代价。
给定两个字符串A和B,及它们的长度和三种操作代价,请返回将A串变为B串所需要的最小代价。保证两串长度均小于等于300,且三种代价值均小于等于100。
测试样例:
"abc",3,"adc",3,5,3,100
返回:8题目分析: 这是标准的动态规划题目。建立dp[n+1][m+1]数组。dp[i][j]表示字符串A[0,1,2....i]到B[0,1,2...j]的变换所用的最小代价。dp[0][i]与dp[j][0]则是表示A空字符串变成B字符串的代价和A字符串变成空串的代价。说明多加了一行和一列且都为空字符。则对于任意的一点(i,j)。其dp[i][j]的式子由下面的情况决定
(1)当A[i-1]==B[j-1]时,说明(i,j)这个点的值,来自下面的三个方向(i-1,j),(i,j-1),(i-1,j-1)。如图:
则dp[i][j]等于dp[i-1][j-1] ,dp[i-1][j]+c1,dp[i][j-1]+c0中的最小值
(2)A[i-1]!=B[j-1]时:
则dp[i][j]等于dp[i-1][j-1] +c2,dp[i-1][j]+c1,dp[i][j-1]+c0中的最小值
程序:
int findMinCost(string A, int n, string B, int m, int c0, int c1, int c2) { vector> dp(n+1,vector (m+1,0));// write code here dp[0][0] = 0; for(int i=1;i < (dp[i][j-1]+c0) ? (dp[i-1][j]+c1) : (dp[i][j-1]+c0); dp[i][j] = min < (dp[i-1][j-1]+c2) ? min : (dp[i-1][j-1]+c2); } } } return dp[n][m]; }
(2)
这是一个经典的LIS(即最长上升子序列)问题,请设计一个尽量优的解法求出序列的最长上升子序列的长度。
给定一个序列A及它的长度n(长度小于等于500),请返回LIS的长度。
测试样例:
[1,4,2,5,3],5
返回:3
程序 int getLIS(vector A, int n) { // write code here vector dp(n,0); dp[0]=1; int len=1,i,j; for(i=1;iA[j]) dp[i]=max(dp[i],dp[j]); } dp[i]++; len=max(len,dp[i]); } return len; } (3) 一个背包有一定的承重cap,有N件物品,每件都有自己的价值,记录在数组v中,也都有自己的重量,记录在数组w中,每件物品只能选择要装入背包还是不装入背包,要求在不超过背包承重的前提下,选出物品的总价值最大。 给定物品的重量w价值v及物品数n和承重cap。请返回最大总价值。 测试样例: [1,2,3],[1,2,3],3,6 返回:6 程序: int maxValue(vector w, vector v, int n, int cap) { // write code here vector dp(cap+1,0); for(int i=0;i =w[i];j--){ dp[j]=max(dp[j],dp[j-w[i]]+v[i]); } } return dp[cap]; }
转载地址:https://blog.csdn.net/xiaochen87654321/article/details/69937235 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
很好
[***.229.124.182]2024年04月15日 11时00分07秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Netty 快速开始(netty websocket客户端使用流程)
2019-04-26
SpringBoot启动时将数据库数据加载到内存
2019-04-26
linux(ubuntu)下英伟达Nvidia 显卡监控工具nvtop使用方法
2019-04-26
数字钱包-理解开发HD 钱包涉及的 BIP32、BIP44、BIP39
2019-04-26
Hibernate JPA-exists查询(判断某条记录是否存在)
2019-04-26
git-拉取指定 tag 版本/切换指定tag代码
2019-04-26
spring boot-整合RabbitMq(RabbitMq基础)
2019-04-26
以太坊智能合约开发-《精通以太坊智能合约开发》学习总结实践
2019-04-26
以太坊-Ethereum Studio工具入门-快速开始
2019-04-26
Hibernate JPA-JPA 只查询(单表、多表)部分字段而不返回全部字段
2019-04-26
Cosmos 是什么?
2019-04-26
Parabolic SAR(抛物线转向指标)
2019-04-26
JAVA语言-判断String是否包含子串
2019-04-26
java 通用内存分页(List分页)
2019-04-26