1. 程式人生 > >uva116(程式碼寫挫了)

uva116(程式碼寫挫了)

思路很明確的一個題目,

但是卻在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;
}