题目链接:https://uva.onlinejudge.org/external/1/116.pdf

和矩形嵌套,巴比伦塔差不多。

题意:

给出矩阵,这个矩阵是环形的,就是说第一行的上一行是最后一行,最后一行的下一行是第一行,要求从最左边一列走到最右边一列,路径上的和最小。多组解输出字典序最小的解。

分析:

DAG多段图,dp(i,j)从第i行,第j列出发的最优解,然后走一遍每一行的第一列。

这里的字典序最小,每次决策时的三个选择,每一行,重新排个序,这样就保证了字典序最小。

姜来是老的辣,写了好久不知道WA在哪里,快写炸了。然后还是参考了下刘汝佳的写法,确实比我写的好一点,借鉴一下。

#include <bits/stdc++.h>

using namespace std;

#define INF 0x3f3f3f3f

int a[][];
int dp[][];
int path[][]; int main()
{
//freopen("in.txt","r",stdin);
int m,n;
while(scanf("%d%d",&m,&n)!=EOF)
{
for(int i=; i<m; i++)
{
for(int j=; j<n; j++)
{
scanf("%d",&a[i][j]);
}
} memset(dp,INF,sizeof(dp)); int ans = INF+;
for(int j=n-; j>=; j--)
{
for(int i=; i<m; i++)
{
if(j==n-) dp[i][j] = a[i][j];
else
{
int row[] = {i,i-,i+};
if(i==) row[] = m-;
if(i==m-) row[] = ;
sort(row,row+); for(int k=; k<; k++)
{
int v = dp[row[k]][j+] + a[i][j];
if(v<dp[i][j])
{
dp[i][j] = v;
path[i][j] = row[k];
}
} } }
} int flag;
for(int i=;i<m;i++) {
if(ans>dp[i][])
{
ans = dp[i][];
flag = i;
}
} printf("%d",flag+);
for(int j=;j<n;j++) {
printf(" %d",path[flag][j]+);
flag = path[flag][j];
}
puts("");
printf("%d\n",ans); } return ;
}
/*
#include <cstdio>
#include <algorithm>
#include <cstring> using namespace std; #define INF 0x3f3f3f3f int a[15][105];
int dp[15][105];
int path[15][105];
int m,n; int main()
{
//freopen("in.txt","r",stdin); while(scanf("%d%d",&m,&n)==2&&m) { for(int i=1;i<=m;i++) {
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
} for(int i=1;i<=m;i++) {
for(int j=1;j<=n;j++)
dp[i][j] = INF;
} memset(path,0,sizeof(path)); for(int i=n;i>=1;i--) {
for(int j=1;j<=m;j++) {
if(i==n) {
dp[j][i] = a[j][i];
path[j][i] = j;
}
else {
if(j==1) { int temp = INF;
int f; if(temp>dp[j][i+1]) {
temp = dp[j][i+1];
f = j;
}
if(temp>dp[j+1][i+1]) {
temp = dp[j+1][i+1];
f = j+1;
}
if(temp>dp[m][i+1]) {
temp = dp[m][i+1];
f = m;
} dp[j][i] = a[j][i] + temp;
path[j][i] = f; }
else if(j==m) { int temp = INF;
int f;
if(temp>dp[1][i+1]) {
temp = dp[1][i+1];
f = 1;
}
if(temp>dp[j-1][i+1]) {
temp = dp[j-1][i+1];
f = j-1;
}
if(temp>dp[j][i+1]) {
temp = dp[j][i+1];
f = j;
} dp[j][i] = a[j][i] + temp;
path[j][i] = f; }
else {
int temp = INF;
int f;
if(temp>dp[j-1][i+1])
{
temp = dp[j-1][i+1];
f = j-1;
}
if(temp>dp[j][i+1]) {
temp = dp[j][i+1];
f = j;
}
if(temp>dp[j+1][i+1]) {
temp = dp[j+1][i+1];
f = j+1;
} dp[j][i] = a[j][i]+temp;
path[j][i] = f;
} }
}
} int flag = 0;
int ans = INF+1;
for(int i=1;i<=m;i++) {
if(ans>dp[i][1])
{
flag = i;
ans = dp[i][1];
}
} printf("%d",flag); for(int i=2;i<=n;i++) {
printf(" %d",path[flag][i-1]);
flag = path[flag][i-1];
}
puts("");
printf("%d\n",ans); } return 0;
}
*/ #include <bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f int a[][];
int dp[][];
int path[][]; int main()
{
freopen("in.txt","r",stdin);
int m,n;
while(scanf("%d%d",&m,&n)!=EOF)
{
for(int i=; i<m; i++)
{
for(int j=; j<n; j++)
{
scanf("%d",&a[i][j]);
}
} for(int i=; i<m; i++)
{
for(int j=; j<n; j++)
dp[i][j] = INF;
} int ans = INF+;
for(int j=n-; j>=; j--)
{
for(int i=; i<m; i++)
{
if(j==n-) dp[i][j] = a[i][j];
else
{
int row[] = {i,i-,i+};
if(i==) row[] = m-;
if(i==m-) row[] = ;
sort(row,row+); for(int k=; k<; k++)
{
int v = dp[row[k]][j+] + a[i][j];
if(v<dp[i][j])
{
dp[i][j] = v;
path[i][j] = row[k];
}
} } }
} int flag;
for(int i=; i<m; i++)
{
if(ans>dp[i][])
{
ans = dp[i][];
flag = i;
}
} printf("%d",flag+);
for(int i = path[flag][], j = ; j < n; i = path[i][j], j++)
printf(" %d", i+);
puts("");
printf("%d\n",ans); } return ;
}

Uva 116,单向TSP的更多相关文章

  1. uva 116 单向TSP

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

  2. UVa 116 单向TSP(多段图最短路)

    https://cn.vjudge.net/problem/UVA-116 题意:给出m行n列的整数矩阵,从第一列任何一个位置出发每次往右,右上或右下走一格,最终到达最后一列,要求经过的整数之和最小. ...

  3. uva 116 Unidirectional TSP (DP)

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

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

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

  5. UVA - 116 Unidirectional TSP (单向TSP)(dp---多段图的最短路)

    题意:给一个m行n列(m<=10, n<=100)的整数矩阵,从第一列任何一个位置出发每次往右,右上或右下走一格,最终到达最后一列.要求经过的整数之和最小.第一行的上一行是最后一行,最后一 ...

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

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

  7. UVa - 116 - Unidirectional TSP

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

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

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

  9. UVa 116: Undirectional TSP

    简单动态规划题.用取模实现第一行与最后一行连续,注意取字典序即可. 我的解题代码如下: #include <iostream> #include <cstdio> #inclu ...

  10. UVA 116 Unidirectional TSP 经典dp题

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

随机推荐

  1. 如何在RedHat6(7) or CentOS6(7)上制作无依赖的PostgreSQL数据库的RPM包

    本文解决了源代码安装都需要先检查系统上是否安装了应用程序所依赖的软件包的烦恼,对源代码开发者也有一定的帮助.可以在该基础上进行适当的修改,以满足自己的要求. RedHat5 or CentOS5已经提 ...

  2. Lintcode: Maximum Subarray III

    Given an array of integers and a number k, find k non-overlapping subarrays which have the largest s ...

  3. Java基础(45):冒泡排序的Java封装(完整可运行)

    1.冒泡排序 package lsg.ap.bubble; import java.util.*; public class BubbleSort { public static void bubbl ...

  4. linux第13天 生产者与消费者

    pthread_cond_t   my_condition = PTHREAD_COND_INITIALIZER; pthread_mutex_t mutex = PTHREAD_MUTEX_INIT ...

  5. Windows服务安装异常:System.Security.SecurityException: 未找到源,但未能搜索某些或全部事件日志。不可 访问的日志: Security

    Windows服务安装异常:System.Security.SecurityException: 未找到源,但未能搜索某些或全部事件日志.不可 访问的日志: Security 2种方法处理: 一.右键 ...

  6. Jquery文档接口遍历

    // children():获取所有子元素 <%@ page language="java" contentType="text/html; charset=utf ...

  7. [Ubuntu] google chrome乱码

    问题描述 ubuntu14.04,之前google chrome一直都是好好的,升级过相关软件,之后就是乱码了,如图 经过google的努力,找到解决方法,原因未明. 解决方案 sudo /etc/f ...

  8. 最懂中文的H5前端框架amazeUI

    Amaze UI 是一个轻量级(所有 CSS 和 JS gzip 后 100 kB 左右)的前端框架, 基于开源社区流行前端框架编写 amazeUI的网址:http://amazeui.org/get ...

  9. Hadoop之TaskAttemptContext类和TaskAttemptID类

    先来看看TaskAttemptContext的类图 : Figure1:TaskAttemptContext类图 用户向Hadoop提交Job(作业),Job在JobTracker对象的控制下执行.J ...

  10. android 项目学习随笔十七(ListView、GridView显示组图)

    ListView.GridView显示组图,处理机制相同 <?xml version="1.0" encoding="utf-8"?> <Li ...