UVa 116 Unidirectional TSP
2017-03-14 22:07
483 查看
//自顶向下
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define MAX 0X7FFFFFFF
int dp[15][1005];
int n,m,map[15][1005];
int to[3]={0,-1,1};//右,右上,右下
int Next[15][1005],ans,first;//ans为最小和 first为第一列走哪行 Next数组为当前位置的下一列在哪行
int DP(int r,int c){
int x,y;
if(dp[r][c]!=MAX){
return dp[r][c];
}
if(c==m){
dp[r][c]=map[r][c];
if(c==1&&dp[r][c]<ans){
ans=dp[r][c];
first=r;
}
return dp[r][c];
}
for(int i=0;i<=2;i++){
x=r+to[i];
y=c+1;
if(r==1&&i==1){
x=n;
}
if(r==n&&i==2){
x=1;
}
int v=DP(x,y)+map[r][c];
if(v<dp[r][c]){
dp[r][c]=v;
Next[r][c]=x;
}
else if(v==dp[r][c]){
Next[r][c]=min(Next[r][c],x);
}
}
if(c==1&&dp[r][c]<ans){
ans=dp[r][c];
first=r;
}
return dp[r][c];
}
int main(){
while(cin>>n>>m){
ans=MAX;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>map[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
dp[i][j]=MAX;
Next[i][j]=MAX;
}
}
for(int i=1;i<=n;i++){
DP(i,1);
}
printf("%d",first);
for(int i=Next[first][1],j=2;j<=m;i=Next[i][j++]){
printf(" %d",i);
}
cout<<endl<<ans<<endl;
}
return 0;
}
//自底向上
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define MAX 0X7FFFFFFF
int dp[15][1005];
int n,m,map[15][1005];
int to[3]={0,-1,1};//右,右上,右下
int Next[15][1005],ans,first;//ans为最小和 first为第一列走哪行 Next数组为当前位置的下一列在哪行
void DP(){
int x,y;
int i,j;
for(j=m;j>=1;j--){
for(i=1;i<=n;i++){
if(j==m){
dp[i][j]=map[i][j];
}
else{
for(int t=0;t<=2;t++){
x=i+to[t];
y=j+1;
if(i==1&&t==1){
x=n;
}
if(i==n&&t==2){
x=1;
}
int v=map[i][j]+dp[x][y];
if(v<dp[i][j]){
dp[i][j]=v;
Next[i][j]=x;
}
else if(v==dp[i][j]){
Next[i][j]=min(Next[i][j],x);
}
}
}
if(j==1&&dp[i][j]<ans){
ans=dp[i][j];
first=i;
}
if(j==1&&dp[i][j]<ans){
ans=dp[i][j];
first=i;
}
}
}
}
int main(){
while(cin>>n>>m){
ans=MAX;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>map[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
dp[i][j]=MAX;
Next[i][j]=MAX;
}
}
DP();
printf("%d",first);
for(int i=Next[first][1],j=2;j<=m;i=Next[i][j++]){
printf(" %d",i);
}
cout<<endl<<ans<<endl;
}
return 0;
}
相关文章推荐
- UVA 116 - Unidirectional TSP(被这个题坑了)
- uva116 - Unidirectional TSP(简单动规)
- UVa 116 - Unidirectional TSP(DP)
- uva 116 Unidirectional TSP
- (UVA - 116)Unidirectional TSP(DP,多段图的最短路问题)
- UVA - 116 - Unidirectional TSP(动态规划)
- uva 116 Unidirectional TSP【号码塔+打印路径】
- uva 116 Unidirectional TSP (DP)
- UVA 116 Unidirectional TSP(dp)
- UVa 116 Unidirectional TSP (多段图的最短路 DP)
- Uva--116 Unidirectional TSP(dp)
- 【解题报告】uva116_Unidirectional TSP(单向TSP, dp)
- uva 116 Unidirectional TSP【数塔+打印路径】
- UVa 116 - Unidirectional TSP(DP)
- UVa116 Unidirectional TSP
- UVA - 116 Unidirectional TSP(dp+多段图的最短路)
- 例题9-4 UVa116 Unidirectional TSP(DP:多段图的最短路)
- UVA 116 Unidirectional TSP 经典dp题
- uva 116 Unidirectional TSP(dp-递归版)
- UVa 116:Unidirectional TSP(DP)