http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18206

题意:M*N的数阵,从左边一列到右边一列走过的数的和的最小。并输出路径和最小值,每一个数能右上,右,右下三种决策,第一行右上是第m行,第m行右下是第1行。

dp【i】【j】存i行j列到最后一列的和的最小,然后逆推,输出路径,就从第一列找最小的dp,然后减去这个数,找右上,右,右下相等的dp,同时行数还得是最小的,思路还是很好想的。做的就是有点麻烦

 #include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int INF = 0x3f3f3f3f;
int a[][],dp[][];
int main()
{
int n,m;
while(scanf("%d%d", &m, &n) != EOF)
{
memset(a, INF, sizeof(a));
for(int i = ; i <= m; i++)
{
for(int j = ; j <= n; j++)
{
scanf("%d", &a[i][j]);
}
} memset(dp, INF, sizeof(dp));
for(int i = ; i <= m; i++)
dp[i][n] = a[i][n]; for(int j = n - ; j >= ; j--)
{
for(int i = ; i <= m; i++)
{
if(i == )
{
dp[i][j] = min(dp[i][j], a[i][j] + dp[m][j + ]);
dp[i][j] = min(dp[i][j], a[i][j] + dp[i][j + ]);
dp[i][j] = min(dp[i][j], a[i][j] + dp[i + ][j + ]);
}
else if(i == m)
{
dp[i][j] = min(dp[i][j], a[i][j] + dp[i - ][j + ]);
dp[i][j] = min(dp[i][j], a[i][j] + dp[i][j + ]);
dp[i][j] = min(dp[i][j], a[i][j] + dp[][j + ]);
}
else
{
dp[i][j] = min(dp[i][j], a[i][j] + dp[i - ][j + ]);
dp[i][j] = min(dp[i][j], a[i][j] + dp[i][j + ]);
dp[i][j] = min(dp[i][j], a[i][j] + dp[i + ][j + ]);
}
}
} int start;
int ans = INF;
for(int i = ; i <= m; i++)
{
if(ans > dp[i][])
{
ans = dp[i][];
start = i;
}
} for(int j = ; j <= n; j++)
{
printf("%d ",start);
int minn = INF;
if(start == )
{
if(dp[start][j - ] - a[start][j - ] == dp[m][j])
{
minn = min(m, minn);
}
if(dp[start][j - ] - a[start][j - ] == dp[start][j])
{
minn = min(start, minn);
}
if(dp[start][j - ] - a[start][j - ] == dp[start + ][j])
{
minn = min(start + , minn);
}
start = minn;
continue;
}
else if(start == m)
{
if(dp[start][j - ] - a[start][j - ] == dp[start - ][j])
minn = min(minn, start - );
if(dp[start][j - ] - a[start][j - ] == dp[start][j])
minn = min(minn, start);
if(dp[start][j - ] - a[start][j - ] == dp[][j])
minn = min(minn, );
start = minn;
continue;
}
else
{
if(dp[start][j - ] - a[start][j - ] == dp[start - ][j])
minn = min(minn, start - );
if(dp[start][j - ] - a[start][j - ] == dp[start][j])
minn = min(minn, start);
if(dp[start][j - ] - a[start][j - ] == dp[start + ][j])
minn = min(minn, start + );
start = minn;
continue;
}
}
printf("%d\n%d\n",start,ans);
}
return ;
}

UVA116Unidirectional TSP(DP+逆推)的更多相关文章

  1. 概率dp——逆推期望+循环迭代zoj3329

    首先要推出dp[i]的期望方程,会发现每一项都和dp[0]相关, 那我们将dp[i]设为和dp[0]有关的式子dp[i]=a[i]*dp[0]+b[i],然后再回代到原来的期望方程里 然后进行整理,可 ...

  2. hdu 3853 LOOPS (概率dp 逆推求期望)

    题目链接 LOOPS Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others)Tota ...

  3. UVA 1025 A Spy in the Metro 【DAG上DP/逆推/三维标记数组+二维状态数组】

    Secret agent Maria was sent to Algorithms City to carry out an especially dangerous mission. After s ...

  4. UVA116-Unidirectional TSP(动态规划基础)

    Problem UVA116-Unidirectional TSP Accept: 7167  Submit: 56893Time Limit: 3000 mSec Problem Descripti ...

  5. HDU 1176-免费馅饼(DP_逆推)

    免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  6. sgu 495. Kids and Prizes (简单概率dp 正推求期望)

    题目链接 495. Kids and Prizes Time limit per test: 0.25 second(s)Memory limit: 262144 kilobytes input: s ...

  7. HDU 5844 LCM Walk(数学逆推)

    http://acm.hdu.edu.cn/showproblem.php?pid=5584 题意: 现在有坐标(x,y),设它们的最小公倍数为k,接下来可以移动到(x+k,y)或者(x,y+k).现 ...

  8. hdu 5063 操作逆推+mul每次要*2%(modo - 1)

    http://acm.hdu.edu.cn/showproblem.php?pid=5063 只有50个询问,50个操作逆推回去即可,注意mul每次要*2%(modo - 1)因为是指数! #incl ...

  9. uva10537 dijkstra + 逆推

    21:49:45 2015-03-09 传送 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8& ...

随机推荐

  1. work_queue 函数调用栈

    init_workqueues --->  create_worker --> kthread_create_on_node

  2. 【C#】【MySQL】C# 查询数据库语句@Row:=@Row+1

    如何实现数据库查询产生虚拟的一列序号的功能: ) )AS r; 该语句可以实现产生虚拟的一列数据在MySQL中运行没有问题. 但是在C#里面调用去出现了错误"Parameter '@ROW' ...

  3. 微信公众平台开发之微信access_token如何有效长期保存

    随着微信使用越来越广泛,微信公众平台开放了许多接口以提供更多个性化的服务,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等,开发者在调用这些接口时,都需要传入一个相同的参数ac ...

  4. js window.open()实现打印,如何在关闭打印窗口时刷新父窗口

    var childWin = window.open("your URL"); //获取子窗口句柄childWin.onunload = function(){ //onunloa ...

  5. 自定义progressBar的旋转圆圈

    在手工打造下拉刷新功能 自带的progressBar太丑了 做个也不费事,一个简单的圆形 旋转动画加type是sweep的gradient渐变 <rotate //旋转动画xmlns:andro ...

  6. html:关于表单功能的学习

    比如我在某jsp页面中写了如下表单: <form action="/MavenWeb/TestFormPost" method="get">   & ...

  7. LeetCode 334 Increasing Triplet

    这个题是说看一个没有排序的数组里面有没有三个递增的子序列,也即: Return true if there exists i, j, k such that arr[i] < arr[j] &l ...

  8. SpringMVC重定向视图RedirectView小分析

    目录 前言 RedirectView介绍 实例讲解 总结 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnbl ...

  9. mvc Areas注册域常见问题一

    添加Areas主要目的是区分一些不同的业务,避免不同的业务都在同一个Controllers下造成混乱,在MVC项目上右键->添加区域->我添加了HMbolie和PClient两个区域-&g ...

  10. 【MPI学习5】MPI并行程序设计模式:组通信MPI程序设计

    相关章节:第13章组通信MPI程序设计. MPI组通信与点到点通信的一个重要区别就是:组通信需要特定组内所有成员参与,而点对点通信只涉及到发送方和接收方. 由于需要组内所有成员参与,因此也是一种比较复 ...