CDOJ 1638 Easy Problem

1800 단어 OtherDP
Problem:http://www.acm.uestc.edu.cn/problem.php?pid=1638
한 2 차원 배열 로 어떤 계단 입구 에 도착 하 는 데 걸 린 시간 을 표시 한 다음 에 아래층 에서 고 층 DP 로 가면 된다.왼쪽 계단 마다 더 높 은 층 으로 올 라 가면 모든 물건 을 보 내 고 왼쪽으로 돌아 가 거나 오른쪽으로 바로 갈 수 있 습 니 다.
#include 

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 end[i][1])
						end[i][1] = j;
					if(j < end[i][0])
						end[i][0] = j;
				}
			}
		}
		if(m < 3)
		{
			printf("Case #%d: %d
", 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
", 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]

좋은 웹페이지 즐겨찾기