CDOJ 1638 Easy Problem

来源:互联网 发布:apu安装ubuntu 编辑:程序博客网 时间:2024/06/07 03:25

Problem:http://www.acm.uestc.edu.cn/problem.php?pid=1638

用一个二维数组表示到达某曾某个楼梯口所用的时间,然后从底层向高层DP即可。对每个左边的楼梯口,上到更高一层后,可以送完所有物品后回到左边,或者直接去到右边。

#include <cstdio>int dp[101][2];char floo[101];int end[101][2];int main(){int T, n, m, top, tmp;scanf("%d", &T);for(int cases=1; cases<=T; ++cases){scanf("%d%d", &n, &m);for(int i=1; i<=n; ++i){scanf("%s", floo);end[i][0] = m-1;end[i][1] = 0;for(int j=1; j<m-1; ++j){if(floo[j] == '*'){if(j > end[i][1])end[i][1] = j;if(j < end[i][0])end[i][0] = j;}}}if(m < 3){printf("Case #%d: %d\n", cases, n-1);continue;}for(top = n; top>=1; --top){if(end[top][0] == m-1)continue;else break;}if(top == 0) {printf("Case #%d: %d\n", cases, n-1);continue;}dp[0][0] = dp[0][1] = -1;for(int i=1; i<=top; ++i){dp[i][0] = dp[i][1] = 0x0fffffff;if(end[i][0] != m-1){tmp = dp[i-1][0]+1+2*end[i][1];if(tmp < dp[i][0])dp[i][0] = tmp;tmp = dp[i-1][0]+m;if(tmp < dp[i][1])dp[i][1] = tmp;tmp = dp[i-1][1]+1+2*(m-1-end[i][0]);if(tmp < dp[i][1])dp[i][1] = tmp;tmp = dp[i-1][1]+m;if(tmp < dp[i][0])dp[i][0] = tmp;}else{tmp = dp[i-1][0]+1;if(tmp < dp[i][0])dp[i][0] = tmp;tmp = dp[i-1][0]+m;if(tmp < dp[i][1])dp[i][1] = tmp;tmp = dp[i-1][1]+1;if(tmp < dp[i][1])dp[i][1] = tmp;tmp = dp[i-1][1]+m;if(tmp < dp[i][0])dp[i][0] = tmp;}}int ans = (dp[top][0]<dp[top][1]?dp[top][0]:dp[top][1]);if(top < n) ans += (n-top); printf("Case #%d: %d\n", cases, ans);}return 0;}


原创粉丝点击