Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
我的程序怎么老是WA阿,测了好多测试数据都没问题,请大家帮着看看。我先把输入的数据排序, 然后从高度最小的格子开始计算出路径长度值,直至计算完高度最大的格子。 这应该也算是dp了吧? 请大侠看看有什么地方错了?感觉逻辑挺简单的,可是老WA。真烦人 ---- /* skiing.c * acm pku edu cn - 1088 * dynamic programming */ #include <stdio.h> typedef struct pair { int index; int value; } pair; int my_max(int m1, int m2, int m3, int m4) { int mx = m1; if(m2 > mx) mx = m2; if(m3 > mx) mx = m3; if(m4 > mx) mx = m4; return mx; } void swap(pair *m1, pair *m2) { pair tmp = { .index = m1->index, .value = m1->value, }; m1->index = m2->index; m1->value = m2->value; m2->index = tmp.index; m2->value = tmp.value; } int split(pair *vp, int length, int start, int end) { int i = start; int x = vp[start].value; int j; for(j= i+1; j<end+1; j++) { if(vp[j].value < x) { i++; if(i != j) swap(&vp[i], &vp[j]); } } swap(&vp[start], &vp[i]); return i; } void quicksort(pair *vp, int length, int start, int end) { int w; if(start < end) { w = split(vp, length, start, end); quicksort(vp, length, start, w-1); quicksort(vp, length, w+1, end); } } void my_sort(pair *vp, int length) { //sort int start = 0, end = length-1; quicksort(vp, length, start, end); } int get_max(int *value, int length, int start, int end) { int middle, m1, m2; if(end-start == 1) return value[end]>value[start]?value[end]:value[start]; else if(end == start) return value[end]; middle = start + (end-start)/2; m1 = get_max(value, length, start, middle); m2 = get_max(value, length, middle+1, end); return m1>m2?m1:m2; } int skiing(int *array, int m, int n, int *value) { int result = 0; int i,v, k; int c, r; int up, down, left, right; pair *vp = malloc(sizeof(pair)*m*n); if(vp == NULL) exit(-1); for(i=0; i<m*n; i++) { vp[i].index = i; vp[i].value = array[i]; } //sort vp by "vp[i].value" my_sort(vp, m*n); #ifdef DEBUG for(i=0; i<m*n; i++) { printf("%d, %d\n", vp[i].index, vp[i].value); } #endif //dynamic programming for(i=0; i<m*n; i++) { c = vp[i].index/n; r = vp[i].index%n; if(c-1 >= 0 && vp[i].value > array[vp[i].index-n]) up = value[vp[i].index-n]; else up = 0; if(c+1 < m && vp[i].value > array[vp[i].index+n]) down = value[vp[i].index+n]; else down = 0; if(r-1 >= 0 && vp[i].value > array[vp[i].index-1]) left = value[vp[i].index-1]; else left = 0; if(r+1 >= 0 && vp[i].value > array[vp[i].index+1]) right = value[vp[i].index+1]; else right = 0; v = value[vp[i].index]; k = 1+my_max(up, down, right, left); if(k > v) value[vp[i].index] = k; } //get the max from value[m][n] result = get_max(value, m*n, 0, m*n-1); free(vp); return result; } int main() { //get the input int r, c; int *array, *value; int result; int i, j; scanf("%d %d", &r,&c); fflush(stdin); array = malloc(r*c*sizeof(int)); value = malloc(r*c*sizeof(int));; for(i = 0; i<r; i++) { for(j=0; j<c; j++) { scanf("%d", &array[i*c+j]); value[i*c+j] = 1; } fflush(stdin); } result = skiing(array, r, c, value); printf("%d\n", result); free(array); free(value); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator