您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: