当前位置: 首页 > 编程日记 > 正文

UVA 116 Unidirectional TSP DP

题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&page=show_problem&problem=52

题目描述: 一个整数矩阵, 求第一列到最后一列的最小整数和, 只能从第一列出发向右, 右下, 右上走, 第一行的上一行是第m行,第m行的下一行是第一行, 打印出字典序最小方案

解题思路: 很简单的一个DP, 状态很容易设计, dp(i, j)表示从格子a(i, j)出发到最后一列的最小开销, dp(i, j) = min( dp(i-1, j+1), dp(i, j+1), dp(i+1, j+1) ), 其中有一些细节需要注意, 具体在代码中实现

代码: 这是我的错误代码, 只能够过得掉样例....打印路径难道我了......怎么说也搞了一年了啊.....真的菜

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <map>
#include <cstring>
#include <iterator>
#include <cmath>
#include <stack>
using namespace std;int a[15][105]; //
int dp[15][105]; // dp(i, j) 表示以从第一行出发a(i, j)为结尾的最短距离
const int INF = 0x3fffffff;
int past[15][105]; // -1 a[i][j]上个点是a[i-1][j] 0......1......
stack<int> S;int main() {int m, n;while( ~scanf( "%d%d", &m, &n ) ) {for( int i = 1; i <= m; i++ ) {for( int j = 1; j <= n; j++ ) {scanf( "%d", &a[i][j] );if( j == 1 ) dp[i][j] = a[i][j];else dp[i][j] = INF;}}memset(past, 0, sizeof(past));
//        for( int i = 1; i <= m; i++ ) {
//            past[i][1] = INF;
//        }for( int j = 2; j <= n; j++ ) {for( int i = 1; i <= m; i++ ) {dp[i][j] = dp[i][j-1]+a[i][j];if( i > 1 ) {if( dp[i-1][j-1]+a[i][j] <= dp[i][j] ) {dp[i][j] = dp[i-1][j-1]+a[i][j];past[i][j] = -1;}}else {if( dp[m][j-1]+a[i][j] < dp[i][j] ) {dp[i][j] = dp[m][j-1]+a[i][j];past[i][j] = -1;}}
//                if( i == 1 && j == 3 ) cout << "==" << dp[i][j] << endl;if( i < m ) {
//                    if( i == 1 && j == 3 ) cout << "==" << dp[i+1][j-1] << " " << a[i][j] << endl;if( dp[i+1][j-1]+a[i][j] < dp[i][j] ) {dp[i][j] = dp[i+1][j-1]+a[i][j];past[i][j] = 1;}}else {if( dp[1][j-1]+a[i][j] <= dp[i][j] ) {dp[i][j] = dp[1][j-1]+a[i][j];past[i][j] = 1;}}}}
//        for( int i = 1; i <= m; i++ ) {
//            for( int j = 1;j <= n; j++ ) {
//                cout << dp[i][j] << " ";
//            }
//            cout << endl;
//        }int ans = INF;int index = -1;for( int i = 1; i <= m; i++ ) {if( dp[i][n] < ans ) {ans = dp[i][n];index = i;}}S.push(index);for( int i = n; i > 1; i-- ) {if( past[index][i] == 0 ) {S.push(index);}else if( past[index][i] == -1 ) {if( index == 1 ) {S.push(index = m);}else {S.push(--index);}}else {if( index == m ) {S.push(index = 1);}else {S.push(++index);}}}while( !S.empty() ) {if( (int)S.size() == 1 ) printf( "%d", S.top() );else {printf( "%d ", S.top() );}S.pop();}printf( "\n" );printf( "%d\n", ans );}return 0;
}
View Code

AC 代码

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <map>
#include <cstring>
#include <iterator>
#include <cmath>
#include <algorithm>
#include <stack>
using namespace std;int d[15][150]; // d[i][j] means 以a[i][j]为起点到最后一列的最短距离
int a[15][150];
int nextt[15][150]; // a[i][j] 下一个点是第next[i][j]行
const int INF = 0x3fffffff;int main() {int m, n;while( ~scanf( "%d%d", &m, &n ) ) {for( int i = 0; i < m; i++ ) {for( int j = 0; j < n; j++ ) {scanf( "%d", &a[i][j] );}}int ans = INF;int first = 0;for( int j = n-1; j >= 0; j-- ) {for( int i = 0; i < m; i++ ) {if( j == n-1 ) d[i][j] = a[i][j]; // 边界else {int rows[3] = { i, i-1, i+1 };if( i == 0 ) rows[1] = m-1;if( i == m-1 ) rows[2] = 0;sort( rows, rows+3 );d[i][j] = INF;for( int k = 0; k < 3; k++ ) {int temp = d[rows[k]][j+1] + a[i][j];if( temp < d[i][j] ) {d[i][j] = temp;nextt[i][j] = rows[k];}}}}}
//        for( int i = 0; i < m; i++ ) {
//            for( int j = 0; j < n; j++ ) {
//                cout << d[i][j] << " ";
//            }
//            cout << endl;
//        }for( int i = 0; i < m; i++ ) {if( d[i][0] < ans ) {ans = d[i][0];first = i;}}printf( "%d", first+1 );for( int i = nextt[first][0], j = 1; j < n; i = nextt[i][j], j++ ) {printf( " %d", i+1 );}printf( "\n" );printf( "%d\n", ans );}return 0;
}
View Code

思考: 本来是一道简单的DP题, 自己却写了一上午, 主要收获如下, 在要求打印路径的时候就要注意设计的状态应该是以dp[i][j]为起点, 不然会有一些BUG, 比如上面的错误代码, 还有一点很重要一点就是: 如果用数组迭代的话, 要保证在计算d[i][j] 时候, 你后面的状态转移设计到的式子全部已经有值........这点非常重要, 因为动态规划应该满足最优子结构, 也就是说, 子结构的值我应该知道, 如果想要倒过来求的话, (边界值在一边, 开始计算在另一边)就应该用到函数递归(记忆化搜索), 其实可以说的数组迭代就是递归的一部分(函数到底后反过来求值那一段。) 自己还是不熟啊, 为了区域赛能拿牌! 加紧练习!

转载于:https://www.cnblogs.com/FriskyPuppy/p/7272994.html

相关文章:

C++ 数据类型转换

wchar_t*,wchar_t,wchat_t数组,char,char*,char数组,std::string,std::wstring,CString....#include <string>// 使用CString必须使用MFC&#xff0c;并且不可包含<windows.h>#define _AFXDLL#include <afx.h>using namespace std;//-----------------------…

如何准备数学建模竞赛!

昨天早晨&#xff0c;我到教十一实验室的时候遇到史会峰老师&#xff0c;他说正准备给学生们进行数学建模的培训。今天早晨&#xff0c;我又遇到了孔令才老师&#xff0c;他同样也说准备给学生们进行数学建模的培训。看到这么多同事在做这个事情&#xff0c;想想自己也应该贡献…

UI设计培训:UI设计师离不开的基本版式设计

不管你是UI设计&#xff0c;还是工业设计&#xff0c;甚至动画设计&#xff0c;终究离不开基本的版式设计&#xff0c;所以版式设计这块非常考验设计师的基础功力。 1. 大且醒目&美观的排版设计 版面设计大概是一位设计师重要的部分&#xff0c;今年的版面设计会围绕着大且…

我对她说,你能不能换件衣服?换种心情?换种脾气?她说,可以,换个人就行了···...

我跟她说&#xff0c;你能不能换件衣服?换种心情?换种脾气?她说&#xff0c;可以&#xff0c;换个人就行了转载于:https://www.cnblogs.com/yangzhong/archive/2010/07/06/1772124.html

如何通过代码连接SQL Server数据库

我们曾经为南方电网做过几个有关架空线路的科技项目&#xff0c;要趁着假期有整段的空闲时间&#xff0c;把这些代码整理一下&#xff0c;放入团队刚刚重构的代码库中。 由于这些项目使用的数据库为 SQL Server&#xff0c;所以在整理代码之前需要解决两个问题&#xff1a; 把…

选择一个稳定、快速的服务器四大注意事项

要想运营好一个网站&#xff0c;稳定和高速的服务器是必不可少的。可是在选择的时候企业就会很发愁&#xff0c;不知道该考虑哪些因素&#xff0c;不知道该怎么选择&#xff0c;下面我们简单的了解一下如何选择一个稳定性好、快速的服务器。 第一 性能要稳定 为了保证网站能够正…

APP不同上线情况对应的测试流程

一个App软件从研发提测到版本上线都会经过哪些测试流程呢?很多人认为就是进行功能测试&#xff0c;没bug了就提交审核&#xff0c;审核通过就直接上线了&#xff0c;其实不然&#xff0c;有些步骤是需要特别关注的&#xff0c;否则极易造成线上bug&#xff0c;本文千锋教育小编…

iOS 进阶—— iOS内存管理

1 似乎每个人在学习 iOS 过程中都考虑过的问题 alloc retain release delloc 做了什么?autoreleasepool 是怎样实现的?__unsafe_unretained 是什么?Block 是怎样实现的什么时候会引起循环引用&#xff0c;什么时候不会引起循环引用?所以我将在本篇博文中详细的从 ARC 解释到…

Google工作原理

今天在晚上看到一个图&#xff0c;讲解google的工作原理&#xff0c;感觉写的不错。贴过来方便以后深入的研究。 转载于:https://www.cnblogs.com/muyuge/archive/2010/07/06/6152590.html

如何利用ArcGis修改shp数据字段名称

最近在处理一批地理信息数据&#xff0c;其中涉及到对shp文件属性字段的修改&#xff0c;在这里做个记录&#xff0c;以防大家再走弯路。 工具&#xff1a; Arcgis软件shp文件 第1步&#xff1a;打开ArcCatalog&#xff0c;选择左上角的链接文件夹&#xff0c;选择你存放数据…

学java为什么要报java培训班?

学java为什么要报java培训班?对于没有基础的小白来说&#xff0c;选择报java培训班是最合适不过的&#xff0c;自学是没有任何规划的&#xff0c;学到的技术都是模棱两可&#xff0c;工作入职后是存在很大风险的&#xff0c;具体的来看看下面的详细介绍吧。 学java为什么要报j…

Tensorflow 全网最全学习资料汇总之框架平台的综合对比【3】

作为机器学习领域、尤其是 Python 生态圈最受欢迎的框架平台&#xff0c;TensorFlow 具有许多吸引开发者的优点。其中最显而易见的是谷歌的技术支持和完善的社区&#xff08;庞大用户群&#xff09;。这些都为 TensorFlow 的普及打下了基础。但是&#xff0c;开发者需要了解 Te…

空间两点间的距离

空间两点间的距离公式推导&#xff0c;有图有真相 转载于:https://www.cnblogs.com/graphics/archive/2010/07/08/1773966.html

如何利用ArcGis把经纬度转成shp数据

这段时间在处理一批地理信息数据&#xff0c;由于部分数据是经纬度坐标&#xff0c;如下图所示&#xff1a; 这样&#xff0c;面对的第一个问题&#xff0c;就是把这批数据转换成shp格式。下面做一个记录&#xff0c;与大家分享。 工具&#xff1a; ArcGIS 软件 Step1&#x…

新手参加java培训都学什么

互联网的强大使得很多IT技术变得越来越吃香&#xff0c;java技术就是其中的一种&#xff0c;很多人都开始学习java技术&#xff0c;下面小编就为大家分享一些新手参加java培训都学什么?希望能够给零基础的学员带来一些帮助。 新手参加java培训都学什么? 1、对于新手学习java的…

第三百三十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—深度优先与广度优先原理...

第三百三十八节&#xff0c;Python分布式爬虫打造搜索引擎Scrapy精讲—深度优先与广度优先原理 网站树形结构 深度优先 是从左到右深度进行爬取的&#xff0c;以深度为准则从左到右的执行&#xff08;递归方式实现&#xff09;Scrapy默认是深度优先的 广度优先 是以层级来执行的…

读懂ConnectString 中 enlist 设置的含义

因为上次遇到在webservice中处理事务的问题&#xff0c;偶然在调试程序的时候对OracleConnection的连接字符串enlist设置的一个有趣的发现。以前看过一篇文章&#xff0c;不记得是什么文章了&#xff0c;文章中说对enlist最好设置为false&#xff0c;当时也没有怎么去深究为什么…

你知道这些 985、211 院校的隶属吗?

前段时间为准备继续深造计算机方向的同学们整理了一些资料&#xff0c;包括&#xff1a; 全国第四轮学科评估结果 – 计算机科学与技术全国第四轮学科评估结果 – 软件工程你知道大陆地区的985、211院校都有哪些吗&#xff1f;你真的知道「专业硕士」与「学术硕士」的11个区别…

新手UI设计师必需要掌握的知识和技能

近几年&#xff0c;许多企业对于UI设计师这个岗位的需求量越来越大&#xff0c;UI设计师的发展空间可见越来越好&#xff0c;想要学好UI设计&#xff0c;必须要掌握足够的知识和技能&#xff0c;下面小编就为大家分享一下新手UI设计师必需要掌握的知识和技能&#xff0c;希望能…

SharePoint 2010中的客户端AJAX应用——ASP.NET AJAX模板

WCF Data Services是SharePoint 2010中一个极具吸引力的新特性。然而&#xff0c;因为它的强大&#xff0c;直接对其进行编程仍然会有点痛苦。幸运的是&#xff0c;一个新的相关技术 —— ASP.Net AJAX模板 – 可以完美的与WCF Data Service进行集成&#xff0c;并允许我们快速…

如何利用Gephi可视化浏览的网站关系

Gephi 是进行数据可视化的一套开源工具。其利用图&#xff08;有向图、无向图、动态图等&#xff09;的形式来展现数据&#xff0c;方便我们对数据进行探索。今天给大家介绍利用 Gephi 来可视化我们浏览网站之间关系。 首先&#xff0c;安装 Gephi 的 Http 代理插件 HttpGraph…

nginx 启动脚本

#vim /etc/rc.d/init.d/nginx #为nginx提供SysV init脚本#!/bin/sh## nginx - this script starts and stops the nginx daemon## chkconfig: - 85 15 # description: Nginx is an HTTP(S) server, HTTP(S) reverse \# proxy and IMAP/POP3 proxy server# …

参加前端培训主要学习什么语言

web前端近几年很多人都在学习中&#xff0c;但是想要学好web前端技术&#xff0c;基础是非常重要的&#xff0c;参加web前端培训机构可以进行系统的学习&#xff0c;下面就给大家详细的介绍一下参加前端培训主要学习什么语言? 参加前端培训主要学习什么语言?前端的基础就是HT…

嘿,程序员,你该学点经济学了!

前言&#xff1a; 笔者一直认为&#xff0c;一个好的程序员。不仅仅是代码敲得好&#xff0c;其它方面的知识和能力相同非常重要。特别是随着年龄的增长。非常多人也慢慢的往管理层发展。这个时候沟通与协调能力变得更加重要&#xff0c;而一些策划。推广方面的知识也相同是必不…

记录一次自己调试代码的过程

今年年初我们做了一套防窃电的软件&#xff0c;其中通讯采取的是串口方式。前段时间&#xff0c;根据现场的反馈&#xff0c;我们增加了蓝牙通讯的功能。系统界面如下图所示&#xff1a; 今天&#xff0c;现场人员反馈说&#xff1a;“解析的数据出现问题”&#xff0c;所以我在…

CBitmapButton的使用(转)

CBitmapButton的使用 CBitmapButton作为MFC的控件类&#xff0c;并不为很多人所使用&#xff0c;因为现在网上遍布着从CButton派生的各种各样的按钮类&#xff0c;其中最为著名的就是CButtonST类了。但是最近在CSDN上看到几个问题都是使用CBitmapButton类&#xff0c;但是由于…

web前端干货:详细了解JS前端开发框架都有哪些

1. Foundation框架 Foundation框架总体来看要比Bootstrap略显高大上一点&#xff0c;但他们俩的设计理念都是非常清楚的&#xff0c;Bootstrap有引导的意思&#xff0c;尝试处理你项目中的一切所需。Foundation有基础、地基及支柱的意思&#xff0c;给项目中强有力的创造与支持…

Platform Builder 5下WinCE 5.0目录结构

Platform Builder 5下WinCE 5.0目录结构 Platform Builder 5已经自带WinCE 5.0&#xff0c;安装过程会指定WinCE 5.0的安装路径&#xff0c;默认为X:\WINCE500&#xff0c;WINCE500即为WinCE 5.0的根目录。根目录下主要有以下几个目录&#xff1a;PUBLIC, PLATFORM, PRIVATE, P…

记录一次自己清理数据的过程

今天接到一个任务&#xff0c;从原始数据&#xff08;在不同监测点对白纹伊蚊&#xff0c;18周的监测数据&#xff09;中提取监测点列表&#xff0c;然后从网上爬取各个监测点的空间信息&#xff08;经纬度&#xff09;&#xff0c;并把这些经纬度数据转换成墨卡托坐标&#xf…

man nfsd(rpc.nfsd中文手册)

本人译作集合&#xff1a;http://www.cnblogs.com/f-ck-need-u/p/7048359.html rpc.nfsd(8) System Managers Manual rpc.nfsd(8)NAMErpc.nfsd - NFS服务进程SYNOPSIS/usr/sbin/rpc.nfsd [options] nprocDESCRIPTIONrpc.nfsd程序…