POJ_2353_Ministry(双向动态规划)

来源:互联网 发布:永恒网络经典合击 编辑:程序博客网 时间:2024/06/04 18:59


#include <iostream>#include <cstdio>using namespace std;int fee[101][501];int dp[101][501];int ans[50000];struct point{    int x;    int y;} way[101][501];int main(){        int m, n;        scanf( "%d%d", &m, &n );        for( int i = 1; i <= m; i++ ){        for( int j = 1; j <= n; j++ ){            scanf( "%d", &fee[i][j] ) ;        }    }        for( int j = 1; j <= n; j++ ){        dp[1][j]    = fee[1][j] ;        way[1][j].x = j ;        way[1][j].y = 0 ;    }        for( int i = 2; i <= m; i++ ){        for( int j = 1; j <= n; j++ ){            dp[i][j]    = fee[i][j] + dp[i - 1][j];            way[i][j].x = j;            way[i][j].y = i - 1;        }                for( int j = 2; j <= n; j++ ){            if( dp[i][j] > dp[i][j - 1] + fee[i][j] ){                dp[i][j]    = dp[i][j - 1] + fee[i][j];                way[i][j].x = j - 1;                way[i][j].y = i;            }        }                for( int j = n - 1; j >= 1; j-- ){            if( dp[i][j] > dp[i][j + 1] + fee[i][j]){                dp[i][j]    = dp[i][j + 1] + fee[i][j];                way[i][j].x = j + 1;                way[i][j].y = i;            }        }    }        int temp = dp[m][1],tempx = 1 ;        for ( int j = 2; j <= n; j++ ){        if( temp > dp[m][j] ){            temp  = dp[m][j] ;            tempx = j ;        }    }        int end = 1, temp1, temp2 ;    int tempy = m ;        while( tempy ){        ans[end++] = tempx ;        temp1 = tempx , temp2 = tempy;        tempx = way[temp2][temp1].x;        tempy = way[temp2][temp1].y;    }        while( --end )        printf( "%d\n", ans[end] );        return 0;    }


原创粉丝点击