简单动态规划题。用取模实现第一行与最后一行连续,注意取字典序即可。

我的解题代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; #define min(a,b) ((a<b)?a:b)
#define max(a,b) ((a>b)?a:b)
#define UL(i) ((i+M-1)%M)
#define DL(i) ((i+1)%M)
#define Maxm 12
#define Maxn 105
const int INF = 0x7fffffff; int M,N;
int Table[Maxm][Maxn];
int MinWeight[Maxm][Maxn], RightRow[Maxm][Maxn];
bool vis[Maxm][Maxn]; int dp(int i, int j)
{
if(vis[i][j]) return MinWeight[i][j]; vis[i][j] = true; if(j==N-1) return MinWeight[i][j] = Table[i][j]; int tmp = min ( dp(UL(i),j+1), min ( dp(i,j+1), dp(DL(i),j+1)));
RightRow[i][j] = Maxm;
if(tmp == MinWeight[i][j+1]) RightRow[i][j] = i;
if(tmp == MinWeight[UL(i)][j+1] && UL(i)<RightRow[i][j]) RightRow[i][j] = UL(i);
if(tmp == MinWeight[DL(i)][j+1] && DL(i)<RightRow[i][j]) RightRow[i][j] = DL(i); return MinWeight[i][j] = tmp+Table[i][j];
}
int main()
{
while(cin >> M >> N)
{
for(int i=0; i<M; i++)
for(int j=0; j<N; j++)
cin >> Table[i][j];
memset(vis,false,sizeof(vis)); int nMinWeight = INF, iRow;
for(int i=0; i<M; i++)
{
if(nMinWeight > dp(i,0))
{
nMinWeight = MinWeight[i][0];
iRow = i;
}
}
cout << iRow+1;
for(int j=0; j<N-1; j++) cout << ' ' << (iRow = RightRow[iRow][j])+1;
cout << endl << nMinWeight << endl;
}
return 0;
}

UVa 116: Undirectional TSP的更多相关文章

  1. uva 116 Unidirectional TSP (DP)

    uva 116 Unidirectional TSP Background Problems that require minimum paths through some domain appear ...

  2. uva 116 Unidirectional TSP【号码塔+打印路径】

    主题: uva 116 Unidirectional TSP 意甲冠军:给定一个矩阵,当前格儿童值三个方向回格最小值和当前的和,就第一列的最小值并打印路径(同样则去字典序最小的). 分析:刚開始想错了 ...

  3. UVA 116 Unidirectional TSP(dp + 数塔问题)

     Unidirectional TSP  Background Problems that require minimum paths through some domain appear in ma ...

  4. UVa - 116 - Unidirectional TSP

    Background Problems that require minimum paths through some domain appear in many different areas of ...

  5. UVA 116 Unidirectional TSP(DP最短路字典序)

    Description    Unidirectional TSP  Background Problems that require minimum paths through some domai ...

  6. UVA 116 Unidirectional TSP 经典dp题

    题意:找最短路,知道三种行走方式,给出图,求出一条从左边到右边的最短路,且字典序最小. 用dp记忆化搜索的思想来考虑是思路很清晰的,但是困难在如何求出字典序最小的路. 因为左边到右边的字典序最小就必须 ...

  7. UVa 116 Unidirectional TSP (DP)

    该题是<算法竞赛入门经典(第二版)>的一道例题,难度不算大.我先在没看题解的情况下自己做了一遍,虽然最终通过了,思路与书上的也一样.但比书上的代码复杂了很多,可见自己对问题的处理还是有所欠 ...

  8. uva 116 单向TSP

    这题的状态很明显. 转移方程就是 d(i,j)=min(d(i+1,j+1),d(i,j+1),d(i-1,j+1)) //注意边界 我用了一个next数组方便打印结果,但是一直编译错误,原来是不能用 ...

  9. UVA - 116 Unidirectional TSP 多段图的最短路 dp

    题意 略 分析 因为字典序最小,所以从后面的列递推,每次对上一列的三个方向的行排序就能确保,数字之和最小DP就完事了 代码 因为有个地方数组名next和里面本身的某个东西冲突了,所以编译错了,后来改成 ...

随机推荐

  1. Java经典23种设计模式之结构型模式(一)

    结构型模式包含7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式事实上非常easy.就像手 ...

  2. CSDN挑战编程——《数学问题》

    数学问题 题目详情: 给你两个长度为n的正整数序列分别为{a1,a2,a3...an},{b1,b2,b3...bn},0<ai,bi<=100: 设S=max{x1*a1+x2*a2+x ...

  3. 异步套接字编程之select模型

      █ 选择(select)模型是Winsock中最常见的 I/O模型.核心便是利用 select 函数,实现对 I/O的管理!利用 select 函数来判断某Socket上是否有数据可读,或者能否向 ...

  4. [转] Makefile中调用Shell

    1.在Makefile中只能在target中调用Shell脚本,其他地方是不能输出的.比如如下代码就是没有任何输出: VAR="Hello" echo "$(VAR)&q ...

  5. codevs 4650 破损的键盘(链表)

    /* 之前一直不重视链表 (好吧说实话主要是看着板子都是指针就怂了T.T) 这道题比较基础 应用了链表的思想 数组模拟指针 遇到的问题就是跑着跑着光标跳到前面或者跳到后面 我们用next储存每个点下一 ...

  6. CSS中伪类的使用

    原文:http://www.cnblogs.com/guopei/archive/2011/04/16/2017627.html 何为伪类? 也就是实际实现了类的效果,但是并没有实际添加到标签中的类, ...

  7. 【sql】经典SQL语句大全

    原文链接:http://www.cnblogs.com/yubinfeng/archive/2010/11/02/1867386.html —————————————————————————————— ...

  8. eclipse中的web-inf下没有web.xml

  9. Knockoutjs官网翻译系列(四) computed中依赖追踪是如何工作的

    初学者无需了解这些 ,但是很多高级程序员想知道我们为什么可以保持跟踪这些依赖以及可以正确的更新到UI中.它其实很简单.跟踪算法是这样的: 无论何时你定义了一个computed observable,K ...

  10. Rational Rose 7.0的使用(转)

    1.Rose如何隐藏类的属性和操作? 右击类图,选择Options->Suppress Attributes/Suppress Operations 2.Rose中如何表示双向关联? 右击关联线 ...