给定一个1*n的地图,在里面玩2048,每次可以合并相邻两个(数值范围1-40),问最大能合出多少。注意合并后的数值并非加倍而是+1,例如2与2合并后的数值为3。
1.首先合并联想到区间,因此此题就是石子合并的变种
2.石子合并的条件是相邻,此题的条件是相邻且相等。注意是能“合并“出多少。
于是状态设置为 dp【i】【j】表示序列中第i个数合并到第j个数”全部合并“所能得到的最大数值。为什么是全部合并呢?因为一个区间能够合并必须满足能够找到两两相等。
int dp[300][300]; int ans; int main() { int n = readint(); for (int i = 1; i <= n; i++) dp[i][i] = readint(); for (int p = 1; p <= n; p++) { for (int i = 1, j = i + p; i <= n && j <= n;i++, j = i + p) { for (int pos = i; pos < j; pos++) { if (dp[i][pos] == dp[pos + 1][j] && dp[i][pos] && dp[pos + 1][j]) { dp[i][j] = max(dp[i][j], dp[i][pos] + 1); ans = max(ans, dp[i][pos] + 1); } } } } printf("%d", ans); }