【BZOJ4580】[Usaco2016 Open]248【區間DP】【或 貪心】

【題目鏈接】

以爲adjacent是不同的意思,結果是相鄰23333,寫了個貪心WA了一發。


題解:

設dp[l][r]表示將l和r合併之後,得到的最大的數,於是就可以轉移了

dp[l][r] = dp[l][k] + 1(dp[l][k] == dp[k + 1][r])

另外還有貪心寫法,只不過太麻煩了...

話說好像寫記憶化搜索的會被卡。。


複雜度:

時間複雜度O(n^3),空間複雜度O(n^2)


收穫:

好好學英語


等把2016的gold刷完後,把翻譯給lydsy交上去...

/* Forgive me Not */
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn = 300;

int n, dp[maxn][maxn], ans;

inline int iread() {
	int f = 1, x = 0; char ch = getchar();
	for(; ch < '0' || ch > '9'; ch = getchar()) f = ch == '-' ? -1 : 1;
	for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
	return f * x;
}

int main() {
	n = iread();
	for(int i = 1; i <= n; i++) ans = max(ans, dp[i][i] = iread());

	for(int l = 2; l <= n; l++) for(int i = 1; i + l - 1 <= n; i++) {
		int j = i + l - 1;
		for(int k = i; k < j; k++) if(dp[i][k] == dp[k + 1][j])
			dp[i][j] = max(dp[i][j], dp[i][k] + 1);
		ans = max(ans, dp[i][j]);
	}
	printf("%d\n", ans);
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章