给定一个m*n的矩阵,请写一个程序计算一条从左到右走过矩阵且权和最小的路径。一条路径可以从第1列的任意位置出发,到达第n列的任意位置。每一步只能从第i列走到第i+1列的同一行或者相邻行(第一行和最后一行看作是相邻的)。

 
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
 
例如1 -> 2 -> 23 -> 24 ->25就是一条路径。
路径的权和为所有经过的n个方格中整数的和。

Input

输入数据包含一个矩阵。

输入数据的第一行为两个数,m和n,分别表示矩阵的行数和列数。(0<m*n<=10000)
接下来m*n个整数按照行优先的顺序依次排列。
 

Output

输出数据包含两行。

第一行给出一个整数,为最小路径的权值。
第二行给出最小路径上从左到右依次经过的行号,有多个最小路径时输出字典序最小的一条。
 
 

Sample Input

5 6
3 4 1 2 8 6
6 1 8 2 7 4
5 9 3 9 9 5
8 4 1 3 2 6
3 7 2 1 2 3
 

Sample Output

11
1 2 1 5 4 5
 
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std; int a[10005][10005];
int path[10005][10005];
const int inf = 99999999; int main()
{
int n,m,i,j,ans,to,v,k,p;
while(~scanf("%d%d",&n,&m))
{
for(i = 0; i<n; i++)
for(j = 0; j<m; j++)
scanf("%d",&a[i][j]);
for(i = m-2; i>=0; i--)//从第m-2列开始,枚举所有状况
{
for(j = 0; j<n; j++)
{
int minn = inf,id = inf;
for(to = -1; to<=1; to++)
{
v = a[(j+to+n)%n][i+1];
p = (j+to+n)%n;
if(minn>v || (minn == v && p<id))//找出最小路径,相同则找字典序小的
{
minn = v;
id = p;
}
}
a[j][i]+=minn;
path[j][i] = id;
}
}
ans = inf;
for(i = 0; i<n; i++)
{
if(ans>a[i][0])
{
ans = a[i][0];
k = i;
}
}
printf("%d\n%d",ans,k+1);
for(i = 0; i<m-1; i++)
{
printf(" %d",path[k][i]+1);
k = path[k][i];
}
printf("\n");
} return 0;
}

最新文章

  1. iOS.Animation.Math-behind-CATransform3D
  2. Android-----工程文件目录介绍
  3. 使用Karma 来进行 JavaScript 测试
  4. centos基本操作
  5. 【python】——小程序之电话薄
  6. Coursera台大机器学习课程笔记14 -- Validation
  7. WPF 将PPT,Word转成图片
  8. 企业Openvpn环境部署
  9. css处理浏览器兼容问题
  10. sql之解决数据库表的循环依赖问题
  11. Razor引擎学习:RenderBody,RenderPage和RenderSection
  12. python在一个列表中查找
  13. spring cuowu
  14. ICG_System之全自动代码生成器V2.0版本
  15. zookeeper 笔记-机制的特点
  16. ssm框架的整合
  17. bzoj 1835: [ZJOI2010]base 基站选址
  18. android客户端向服务器发送请求中文乱码的问
  19. Iris jwt 使用
  20. git常用命令(转载自用)

热门文章

  1. CentOs6.5 安装rabbitmq(转)
  2. kill -HUP pid 更改配置后不重新启动服务,动态更新配置文件
  3. 16 款最流行的JavaScript 框架
  4. Python 字符串切片
  5. TCP/IP和Socket的关系
  6. 矩阵分解(Matrix Factorization)与推荐系统
  7. Spring 4 官方文档学习(六)核心技术之Spring AOP
  8. 在不指定特殊属性的情况下,哪几种HTML标签可以手动输入文本:()
  9. YUV数据YUY2到I420
  10. (转)MFC鼠标单击消息拦截双击消息