P1088 动态规划

题目连接:POJ P1088

无意看到这题,挺激动的,因为看到了第一感觉就是,这是高中做过的动归题啊~手痒不止啊~很有种冲动去解决这个题目。但是很让人伤心的是,我居然不能很快的做出这个题目。

这题本妄想一次循环,直接规划处最优结果。苦于没有办法得到结果,就想去看看别人的想法,看到别人解法上给的循环两字,茅塞顿开啊。因为可以一次又一次的向最优结果靠近,当达到最优结果的时候,循环不会改变任何的值(结束条件啊)。代码如下:

//author: oliver-g
//language: C
//time: 2012-6-27
#include <stdio.h>

int main(){
    int i, j, flag, max;
    int r, c;
    int array[102][102];
    int ans[102][102];
    
    scanf("%d%d", &r, &c);
    
    //init the array
    for (i = 0; i < r+2; i++){
        for (j = 0; j < c+2; j++){
            array[i][j] = 10001;
        }
    }
    
    for (i = 1; i <= r; i++){
        for (j = 1; j <= c; j++){
            scanf("%d", &array[i][j]);
            ans[i][j] = 1;
        }
    }
    
    //loop
    flag = 1;
    while (flag){
        flag = 0;  //if the flag changes, the ans has updates.
        for (i = 1; i <= r; i++){
            for (j = 1; j <= c; j++){
                
                // find the max(arr[i][j+1], arr[i][j-1], arr[i+1][j], arr[i-1][j])
                max = ans[i][j] -1 ;
                if (array[i][j] > array[i][j+1] && max < ans[i][j+1]){
                    max = ans[i][j+1];
                    flag = 1;
                }
                if (array[i][j] > array[i][j-1] && max < ans[i][j-1]){
                    max = ans[i][j-1];
                    flag = 1;
                }
                if (array[i][j] > array[i-1][j] && max < ans[i-1][j]){
                    max = ans[i-1][j];
                    flag = 1;
                }
                if (array[i][j] > array[i+1][j] && max < ans[i+1][j]){
                    max = ans[i+1][j];
                    flag = 1;
                }
                
                ans[i][j] = 1+max;
            }
        }
        
    }
    
    max = 0;
    for (i = 1; i <=r; i++){
        for (j = 1; j <=c; j++){
            if (ans[i][j] > max){
                max = ans[i][j];
            }
        }
    }
    
    printf("%d", max);
    system("pause");
}

向我的高中老师江老师谢罪~~

你可能感兴趣的:(poj,p1088)