您的位置:首页 > 其它

URAL 1029 Ministry

2012-05-02 21:55 239 查看
URAL_1029

dp。

#include<stdio.h>
#include<string.h>
#define MAXN 110
#define MAXM 510
int N, M, a[MAXN][MAXM], p[MAXN][MAXM];
long long f[MAXN][MAXM];
void init()
{
int i, j;
for(i = 1; i <= N; i ++)
for(j = 1; j <= M; j ++)
scanf("%d", &a[i][j]);
}
void dfs(int x, int y)
{
if(p[x][y] == -1)
{
printf("%d", y);
return ;
}
if(p[x][y] == 0)
dfs(x - 1, y);
else if(p[x][y] == 1)
dfs(x, y - 1);
else
dfs(x, y + 1);
printf(" %d", y);
}
void solve()
{
int i, j, x, y;
long long ans;
for(i = 1; i <= M; i ++)
f[1][i] = a[1][i], p[1][i] = -1;
for(i = 2; i <= N; i ++)
{
for(j = 1; j <= M; j ++)
f[i][j] = f[i - 1][j] + a[i][j], p[i][j] = 0;
for(j = 2; j <= M; j ++)
if(f[i][j - 1] + a[i][j] < f[i][j])
f[i][j] = f[i][j - 1] + a[i][j], p[i][j] = 1;
for(j = M - 1; j >= 1; j --)
if(f[i][j + 1] + a[i][j] < f[i][j])
f[i][j] = f[i][j + 1] + a[i][j], p[i][j] = 2;
}
ans = f
[1], x = N, y = 1;
for(i = 2; i <= M; i ++)
if(f
[i] < ans)
ans = f
[i], y = i;
dfs(x, y);
printf("\n");
}
int main()
{
while(scanf("%d%d", &N, &M) == 2)
{
init();
solve();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: