动态规划题集

1.使用动态规划策略设计算法,最重要的步骤是:

最优性原理和递推关系式

2.流水线证明题

在这里插入图片描述
在这里插入图片描述

3.多段图计算题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.TSP问题设计题

在这里插入图片描述
在这里插入图片描述
贪心算法简介
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

贪心算法应用于TSP问题
贪心算法是一种算法策略,或者说问题求解的策略。基本思想是“今朝有酒今朝醉”。即一定要做当前情况下的最好选择,否则将来可能后悔,故名“贪心”。
将贪心算法应用于TSP问题中的求解思想:从某一个城市开始,每次选择一个城市,知道所有城市都被走完。注:每次在选择下一个城市的时候,只考虑当前情况,保证迄今为止经过的路径的总距离最短。

/*
外层循环:从i=1开始循环,i小于n, 初始化最短距离为10000(取一个大值,使其至少大于城市距离矩阵中的最大值)。即首先求出第1次将要访问的城市代号(利用中层循环及内层循环求解),然后将求出的第1次将要访问的城市代号j赋值给City[1],并将当前城市(代号0)至代号为j的城市的距离Dtmp累加至Sum。直至求出第n-1次要访问的城市代号。
中层循环:从k=1开始循环,k小于n,初始化Found的值为0。即先假设第i次要访问的城市代号为1,并判断代号为1的城市有没有出现在前几次访问过的城市中(利用内层循环判断),如果代号为1的城市没有出现在已经访问过的城市中并且当前城市(代号i-1)至代号为1的城市的距离小于Dtmp,那就把k=1的值赋值给j,再把当前城市(代号i-1)至代号为1的城市的距离赋值给Dtmp。直至循环到代号为n-1的城市,这样就能根据局部最短距离求出下一个城市的代号i与距离Dtmp。
内层循环:从l=0开始循环,l小于i,判断第l次访问过的城市代号是否与k的值相等,如果相等,代表第l次已经访问过代号为k的城市了,那么就将Found值置1,跳出循环。直至判断完第i-1次访问过的城市。
*/
#include <stdio.h>
#define n 4

int main(void) {
	int Dis[n][n], City[n], Sum, i, j, k, l, Dtmp, Found;
	City[0] = 0;
	Sum = 0;
	Dis[0][1] = 2; Dis[0][2] = 1; Dis[0][3] = 5; Dis[1][0] = 2; Dis[1][2] = 4;
	Dis[1][3] = 4; Dis[2][0] = 1; Dis[2][1] = 4; Dis[2][3] = 6; Dis[3][0] = 5;
	Dis[3][1] = 4; Dis[3][2] = 6;

	for (i = 1; i < n; i++) {
		Dtmp = 10000;                    
		for (k = 1; k < n; k++) {
			Found = 0;
			for (l = 0; l < i; l++) {
				if (City[l] == k) {
					Found = 1;
					break;
				}
			}
			if (Found == 0 && Dis[City[i - 1]][k] < Dtmp) {
				j = k;
				Dtmp = Dis[City[i - 1]][k];
			}
		}
		City[i] = j;
		Sum = Sum + Dtmp;
	}

	Sum = Sum + Dis[j][0];
	for (i = 0; i < n; i++) {
		printf("%d\t", City[i]);
	}
	printf("\n");
	printf("Sum = %d", Sum);

	getchar();
}

5.多段图简答题

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

6.动态规划设计题

在这里插入图片描述

证明最优性原理可参考01背包
在这里插入图片描述
dp(T) = min(dp(T - vi)) + 1, 其中T-vi < T是恒成立

#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn1 = 50 + 5;
const int maxn2 = 1e5 + 10;
int v[maxn1];
int dp[maxn2];
int n;
int main() {
	int T;
	while (scanf("%d%d", &n, &T) == 2 && (n || T)) {
		for (int i = 1; i <= n; i++)scanf("%d", &v[i]);
		dp[0] = 0;
		for (int i = 1; i <= T; i++)dp[i] = maxn2;
		for (int i = 1; i <= T; i++) {
			for (int j = 1; j <= n; j++) {
				if (i >= v[j])dp[i] = min(dp[i], dp[i - v[j]] + 1);
			}
		}
		for (int i = T; i >= 0; i--)
			if (dp[i] != maxn2) {
				printf("%d\n", dp[i]);
				break;
			}
	}
	return 0;
}

7.动态规划简答题

列出动态规划求解最短周游路线问题的递推关系式
在这里插入图片描述

8.动态规划01背包

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
大同小异,做一题就可了哈??第二问才是考动态规划,第一问是贪心的事
在这里插入图片描述

9.流水线调度问题计算题

OFT算法思想:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

10.动态规划在实际应用中的适用条件

动态规划
在这里插入图片描述

11.最优二分检索树

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

12.动态规划选择题

不适合用动态规划解决的是分类问题

13.动态规划简答题

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

14.动态规划计算题TSP

在这里插入图片描述
在这里插入图片描述

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值