晴天小豬歷險記之Hill

鏡owo發表於2020-10-23

時間限制 1000 ms
記憶體限制 128 MB

題目描述

這一天,他來到了一座深山的山腳下,因為只有這座深山中的一位隱者才知道這種藥草的所在。但是上山的路錯綜複雜,由於小小豬的病情,晴天小豬想找一條需時最少的路到達山頂,但現在它一頭霧水,所以向你求助。
山用一個三角形表示,從山頂依次向下有1段、2段、3段等山路,每一段用一個數字T(1< =T< =100)表示,代表晴天小豬在這一段山路上需要爬的時間,每一次它都可以朝左、右、左上、右上四個方向走(注意:在任意一層的第一段也可以走到本層的最後一段或上一層的最後一段)。
晴天小豬從山的左下角出發,目的地為山頂,即隱者的小屋。

輸入資料

第一行有一個數 n (2≤n≤1000),n (2≤n≤1000), 表示山的高度。
 從第二行至第 n+1n+1 行,第 i+1i+1 行有 ii 個數,每個數表示晴天小豬在這一段山路上需要爬的時間。

輸出資料

一個數,即晴天小豬所需要的最短時間。

樣例輸入

5
1
2 3
4 5 6
10 1 7 8
1 1 4 5 6

樣例說明

10

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <algorithm>
#include <string>
#include <iostream>
#define INF 0x3f3f3f3f

using namespace std;

int a[1002][1002] = { 0 };
int dp[1002][1002] = { 0 };

int main()
{
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= i; j++) {
			scanf("%d", &a[i][j]);
			//cin >> a[i][j];
		}
	}

	dp[1][1] = a[1][1];
	for (int i = 2; i <= n; i++) {
		for (int j = 1; j <= i; j++) {
			if (j == 1 || j == i) {
				int ans1 = dp[i - 1][1] + a[i][j];
				int ans2 = dp[i - 1][i - 1] + a[i][j];
				dp[i][j] = min(ans1, ans2);
			}
			else {
				int ans1 = dp[i - 1][j - 1] + a[i][j];
				int ans2 = dp[i - 1][j] + a[i][j];
				dp[i][j] = min(ans1, ans2);
			}
		}
		//for (int k = 1; k <= i; k++) {
		//	cout << dp[i][k] << " ";
		//}
		//cout << endl;
		//cout <<  "---------------------------" << endl;
		int t = i;
		while(t--)
		for (int k = 1; k <= i; k++) {
			int r = k + 1;
			int l = k - 1;
			if (r > i) r = 1;
			if (l < 1) l = i;
			int ans1 = dp[i][r] + a[i][k];
			int ans2 = dp[i][l] + a[i][k];
			for (int num = 1; num < i; num++) {
				if (r > i) r = 1;
				if (ans1 < dp[i][k])	dp[i][k] = ans1;
				else break;
				ans1 += a[i][r++];
			}
			for (int num = 1; num < i; num++) {
				if (l < 1) l = i;
				if (ans2 < dp[i][k])	dp[i][k] = ans2;
				else break;
				ans2 += a[i][l--];
			}
		}
		//for (int k = 1; k <= i; k++) {
		//	cout << "a[" << a[i][k] << "]" << "dp[" << dp[i][k] << "] ";
		//}
		//for (int k = 1; k <= i; k++) {
		//	cout << dp[i][k] << " ";
		//}
		//cout << endl;
		//cout << "---------------------------" << endl;
	}
	cout << dp[n][1] << endl;

	return 0;
}

相關文章