动态规划(2)

动态规划(2)

文章目录

1、聪明的寻宝人

c 复制代码
#include <iostream>
using namespace std;
void MaxValue(int values[], int weights[], int n, int m) {
    int dp[21][51] = {0};
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            if (weights[i - 1] <= j) {
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weights[i - 1]] + values[i - 1]);
            } else {
                dp[i][j] = dp[i - 1][j];
            }
        }
    }
    cout << dp[n][m] << endl;
 }

2、基因检测

c 复制代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;

void Similar(char *str1, char *str2) {
    int m = strlen(str1);
    int n = strlen(str2);
    int dp[51][51] = {0};
    int maxLen = 0;
    for (int i = 1; i <= m; ++i) {
        for (int j = 1; j <= n; ++j) {
            if (str1[i - 1] == str2[j - 1]) {
                dp[i][j] = dp[i - 1][j - 1] + 1;
                maxLen = max(maxLen, dp[i][j]);
            } else {
                dp[i][j] = 0; 
            }
        }
    }
    cout << maxLen ;
}

3、药剂稀释

c 复制代码
#include <algorithm>
using namespace std;

void Cal(double arr[],int n)
{
    /**********   Begin   **********/
	
	//补充代码完成任务
    int dp[n];
    for(int i=0;i<n;i++) dp[i]=1;
    for(int i=n-2;i>=0;i--){
        for(int j=i+1;j<n;j++){
            if(arr[i]>=arr[j]) dp[i]=dp[i]<(dp[j]+1)?(dp[j]+1):dp[i];
        }
    }
    int max=1;
    for(int i=0;i<n;i++){
      
        if(max<dp[i]) max=dp[i];
    }
    printf("%d",max);
	/**********   End   **********/
}

4、找相似串

c 复制代码
#include <iostream>
#include <cstring>
using namespace std;
const int MAX=60;
void Similar()
{
	/**********   Begin   **********/
	char s[MAX];
	int n,end;
	cin >> s>>n;//读取主串和子串个数
	int len_s = strlen(s);
	char arr[20][MAX];
	int caozuo[20];//存操作次数
	int dp[MAX][MAX];//用数组dp[i][j]表示,子串从1-i转换到主串的操作数。
	for (int i = 0; i < n; i++)//读取子串
	{
		cin>>arr[i];
	}	
	for (int i = 0; i < len_s; i++)
	{
		dp[0][i] = i;  //处理边界
	}
	for (int k = 0; k < n; k++)//第k个子串
	{
		int len = strlen(arr[k]);//子串长度
		//初始化
		for (int j = 0; j < len; j++)
			dp[j][0] = j;
 
		for (int i = 1; i < len_s; i++)//i为主串下标
		{
			for (int j = 1; j < len; j++)//j为子串下标
			{
				if (s[i] == arr[k][j])
					dp[i][j] = dp[i - 1][j - 1];
				else
					dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + 1;
			}
		}
		caozuo[k] = dp[len_s-1][len-1];//存每个子串的最小操作数
	}
	end = caozuo[0];
	for (int i = 1; i < n; i++)
		end = min(end, caozuo[i]);  //找到最小操作数
	for (int i = 0; i < n; i++)
	{
		if (caozuo[i] == end)
			cout << arr[i] << endl;  //输出对应串
	}
 
	/**********   End   **********/
}
相关推荐
96772 分钟前
C++ Lambda 表达式 匿名函数 sort
数据结构·c++·算法
codeの诱惑8 分钟前
推荐算法(二):核心概念——余弦定理 & 余弦相似度
算法·机器学习·推荐算法
liuyao_xianhui13 分钟前
优选算法_锯齿形层序遍历二叉树_队列_C++
java·开发语言·数据结构·c++·算法·链表
秃头狂魔22 分钟前
【HOT100】DAY2
python·算法
想带你从多云到转晴28 分钟前
03、数据结构与算法--单向链表
java·数据结构·算法
mjhcsp33 分钟前
AT_arc205_c [ARC205C] No Collision Moves 题解
开发语言·c++·算法·题解
Yzzz-F33 分钟前
Problem - 1114C - Codeforces[勒让德公式]
算法
木井巳1 小时前
【笔试强训】Day1
java·算法
leiming61 小时前
巧用 FreeRTOS 任务通知作“邮箱”:NeoPixel 灯环控制实战
java·前端·算法
老四啊laosi1 小时前
[双指针] 4. 力扣--盛最多水的容器
算法·leetcode·装水最多的容器