這一題要找一個table從左走到右的最小和路徑。題目寫的很像可以用brute force,但用brute force會超過time limit。後來想到DP的方法,很開心。DP真是一種很神奇的概念。
寫出來後一直runtime error,看很久才發現是表格頭接尾,尾接頭的部分沒有用餘數的方法讓他自動接,造成有漏洞會陣列越界讀取。改成餘數的方法就解決了。果然越好的演算法越不會有奇怪的洞啊。
CODE
#include <stdlib.h> #include <stdio.h> #define MAX_M 10 #define MAX_N 100 int main(){ int i, j, k, min, tmp; int m, n, t[MAX_M][MAX_N], p[MAX_M][MAX_N]; int mod[2] = {-1, 1}; while( scanf("%d %d", &m, &n) == 2 ){ for(i=0; i<m; i++) for(j=0; j<n; j++) scanf("%d", &t[i][j]); for(j=(n-2); j>=0; j--){ for(i=0; i<m; i++){ min = i; for(k=0; k<2; k++){ tmp = (i+mod[k]+m) % m; if( t[tmp][j+1] < t[min][j+1] ) min = tmp; else if( t[tmp][j+1] == t[min][j+1] ) if( tmp < min ) min = tmp; }/*k*/ p[i][j] = min; t[i][j] += t[min][j+1]; }/*i: row*/ }/*j: col*/ k = 0; for(i=1; i<m; i++) if( t[i][0] < t[k][0] ) k = i; j = k; printf("%d", k+1); for(i=0; i<n-1; i++){ printf(" %d", p[j][i]+1); j = p[j][i]; } printf("\n%d\n", t[k][0]); }/*while input data*/ exit(0); }
No comments:
Post a Comment