海贼王之伟大航路

news/2024/11/29 8:37:49/

题目链接

思路:基本状压dp
看题目知道此题求的是最短哈密顿路径,也就是一条从1到n的经过所有点的最短路径。

我们可以使用状态压缩,使用一个二进制数state代表一种状态,state代表经过的所有点的集合。
例如
state=1,代表只经过1号点。
state=3(二进制为0011),代表经过1号点和2号点。
state=5(二进制为0101),代表经过1号点和3号点。
state=6(二进制为0110),代表经过2号点和3号点。

我们设定dp[state][j]代表经过点的集合为state,并且最后一个点为j号点。
由此推出状态转移方程为:dp[state][j] = min(dp[state - (1 <<j-1) ][k] + w[k][j] )
state - (1 <<j-1),表示从state点集中删去第j号点,w[k][j]代表从k到j路径的长度。
代表的含义为:依次遍历终点为j的每条边,以及对应的点集,从而可以推出dp[state][j]的最小值。
核心代码1:这是写的第一版代码,有个小问题

    //initmemset(dp, 0x3f, sizeof dp);for (int i = 1; i <= N; i++) {                                                      //只有一个点,所以路径为0dp[1<<(i-1)][i] = 0;}//for (int state = 1; state <= (1<<N) - 1; state++) {                     // 枚举所有状态for (int j = 1; j <= N; j++) {                                                 // 1 or 2if(state & 1 << (j-1) && state - (1 << (j-1))){                     //判断状态state是否包含第j个点,并且状态中最少有两个点。int minj = INT_MAX;for (int k = 1; k <= N; k++) {minj = min(minj, dp[state-(1<<(j-1))][k]+G[k][j]);     //状态转移方程}dp[state][j] = minj;}}}

在上面的代码中的初始化部分,首先将所有状态初始化为INF,因为要求的是最小值,所有初始化为最大值,避免产生干扰。
然后将所有只有一个点的状态初始化为0.
接下来就是状态转移方程,求最小值。
但是,这里有问题,在遍历 j 的时候,我的 j 是从第一个点开始遍历的,这将导致求出来的最短路径可能不是从第一个点开始的,这样只能算出以最后一个点结尾的最短路径,而不能算出从第一个点开始,以最后一个点结尾的最短路径。
例如:

样例1:
0 10 20 999
5 0 90 30
99 50 0 10
999 1 2 0

最后求出的结果为:2 -> 1 -> 3 -> 4,明显看到不是以1号点开始。

核心代码2:改进后

   //initmemset(dp, 0x3f, sizeof dp);for (int i = 1; i <= N; i++) {                                                      //只有一个点,所以路径为0dp[1<<(i-1)][i] = 0;}//for (int state = 1; state <= (1<<N) - 1; state++) {                     // 枚举所有状态for (int j = 2; j <= N; j++) {                                                 // 1 or 2if(state & 1 << (j-1) && state - (1 << (j-1))){                     //判断状态state是否包含第j个点,并且状态中最少有两个点。int minj = INT_MAX;for (int k = 1; k <= N; k++) {minj = min(minj, dp[state-(1<<(j-1))][k]+G[k][j]);     //状态转移方程}dp[state][j] = minj;}}}

改进之处为: j 不再从1号点开始,而从2号点开始,如此一来,相当于所有1号点的入边都被忽略了,只计算了1号点的出边。这样肯定只能从1号点开始。

最后附上AC代码:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cmath>
#include <limits.h>
#include <iomanip>
#include <queue>
#include <cstring>
using namespace std;typedef long long LL;typedef vector<int> vec;//#pragma GCC optimize(2)static int N;static int G[20][20];
static int dp[1<<20][20];                                         //dp[state][j]  经过的点集为state,最后一个点为jvoid work(void){//initmemset(dp, 0x3f, sizeof dp);for (int i = 1; i <= N; i++) {                                                     //只有一个点,所以路径为0dp[1<<(i-1)][i] = 0;}//for (int state = 1; state <= (1<<N) - 1; state++) {                       // 枚举所有状态for (int j = 2; j <= N; j++) {                                                      // 1 or 2if(state & 1 << (j-1) && state - (1 << (j-1))){                     //判断状态state是否包含第j个点int minj = INT_MAX;for (int k = 1; k <= N; k++) {minj = min(minj, dp[state-(1<<(j-1))][k]+G[k][j]);}dp[state][j] = minj;}}}cout << dp[(1<<N)-1][N] << endl;
}int main()
{//  freopen("E:\\Desktop\\data.txt", "r", stdin);//ios::sync_with_stdio(false);cin >> N;for (int i = 1; i <= N; i++) {for (int j = 1; j <= N; j++) {cin >> G[i][j];}}work();return 0;
}

http://www.ppmy.cn/news/320446.html

相关文章

大航海时代的海贼王

《目录》 为什么要读大学各国大学哲学的逻辑 缘起性空 对不净观的探讨生命的意义&#xff0c;是成为你自己 大航海时代的海贼王&#xff0c;单纯为自己而写。 从一年前开始&#xff0c;学习编程的劲头慢慢的弱了...... 我也正面临考试&#xff0c;只是对于如何选择全是空白。…

动态规划-打败怪兽的概率(java)

打败怪兽的概率 打败怪兽的概率暴力递归代码演示 动态规划代码演示 动态规划专题 打败怪兽的概率 给定3个参数&#xff0c;N&#xff0c;M&#xff0c;K 怪兽有N滴血&#xff0c; 等着英雄来砍自己 英雄每一次打击&#xff0c; 都会让怪兽流失[0~M]的血量 到底流失多少&#xf…

【PCB专题】案例:绕等长怎么直接以颜色区分看出是否绕好

PCB上对于时序的处理,在板卡上实际我们是通过绕等长的手段。做为一个合格的Layout工程师,等长的处理是不可或缺的技能。 一般来说,在绕等长的时候我们可以使用Delay Tune命令来改变走线的长度,然后通过规则管理器中分析看看哪根线长哪根线短。 但是在实际工作中,很可能绕着…

51日记5

01/17 20&#xff1a;25(逛街给她买了个小熊巧克力)啊&#xff1f;恩我把它吃了&#xff0c;亨亨它哭了。那你累了就休息会儿&#xff0c;01/18 23&#xff1a;00(在她面前有两个选择,她会选谁呢?)刚走进宿舍传来的是对爱情观的争论&#xff0c;这时有一个人她心里不知道为什么…

别人的收藏

0DAY 0day divxz 数据库 0day Gamez How to tell NFOrce Entertainment TLF 0DayCheck Index TLF资讯网 UGiA 0day search engine _ 2002-2005 梦幻0Day&#xff5e;game 阿拉下载 龙族-北京站 - MC SYSTEM 2004 BBS 下载论坛 9Down Forum 9Team BillWang论坛 DreamLand FTP情报…

[创业路程] 从Idea到付诸实践,你必须要知道的…创业草堂系列

创业草堂系列 [创业路程] 从Idea到付诸实践&#xff0c;你必须要知道的… 来源 世界经理人 社区 转载 qq1163551688 繁荣 创业 的Idea是怎样产生的&#xff1f; [创业草堂之1]  “创业”&#xff0c;在很多人的想象中&#xff0c;就是两个小伙子在车库里、或者在学生…

RPG游戏设计

目录&#xff1a; 第一章 概述 第二章 场景 第三章 角色 第四章 道具 第五章 事件 第六章 对白 第七章 语音和音效 第八章 音乐 第九章 界面 第十章 规则 第十一章 命名 第一章&#xff1a;概述 RPG游戏即角色扮演游戏&#xff08;Role Personate Game&#xff09;&#xff0c;…

从Idea到付诸实践,你必须要知道的

创业 的Idea是怎样产生的&#xff1f; [创业草堂之1]  “创业”&#xff0c;在很多人的想象中&#xff0c;就是两个小伙子在车库里、或者在学生寝室里&#xff0c;侃出了一个Idea&#xff0c;然后找到了一个投资 人或VC&#xff0c;经过几句话讲解&#xff0c;VC拍手叫绝&am…