uva116(程式碼寫挫了)
阿新 • • 發佈:2019-01-30
思路很明確的一個題目,
但是卻在uva上wa了好多次,但是在hdu上過了,問題在於,hdu資料不全
當列數為1 的時候,我原來的程式碼是會崩的,並且會錯,幸好一開始錯在RE才讓我想到1的問題,要是一直wa,可能真的要找更久的bug了,這個細節,真的該好好反思一下
錯誤程式碼 : 如何m==1的話,當j==m-1時,後面j==0是無法進入的,被continue掉了;
樣例:
/*
4 1
3
2
1
5
answer:
3
1
*/
正確程式碼如下:
#include <iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<string> #include<vector> using namespace std; const int maxn=1000; const int inf=0x3f3f3f3f; int a[maxn][maxn]; int dp[maxn][maxn]; int nextt[maxn][maxn]; int n,m; void solve() { int ans=inf; int first=0; for(int j=m-1; j>=0; j--) { for(int i=0; i<n; i++) { if(j==m-1) { dp[i][j]=a[i][j]; } else { dp[i][j]=inf; int row[]= {i,i+1,i-1}; if(i==0) row[2]=n-1; if(i==n-1) row[1]=0; sort(row,row+3); for(int k=0; k<3; k++) { if(dp[i][j]>dp[row[k]][j+1]+a[i][j]) { dp[i][j]=dp[row[k]][j+1]+a[i][j]; nextt[i][j]=row[k]; } } } if(j==0&&ans>dp[i][j]) { ans=dp[i][j]; first=i; } } } cout<<first+1; for(int i=nextt[first][0],j=0; j<m-1; j++,i=nextt[i][j]) cout<<" "<<i+1; cout<<endl; cout<<ans<<endl; } int main() { while(cin>>n>>m) { for(int i=0; i<n; i++) for(int j=0; j<m; j++) cin>>a[i][j]; solve(); } return 0; }