P7266 [BalticOI 2000] Honeycomb Problem 的题解
题目大意
略。
思路
这题挺难的!
观察数据范围,发现
设
我们发现蜂窝图的行和列都是
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n + i - 1; j++) {
cin >> a[i][j];
}
for(int i = 1; i <= n - 1; i++)
for(int j = 1; j <= 2 * n - i - 1; j++) {
cin >> a[i + n][j];
}
然后我们来讨论一下状态转移方程。
转移方程主要分成两种情况(为了方便,数组就不用
-
从第
1 行到第n 行(列数递增),易得转移方程:dp[i][j][0] = \max(dp[i-1][j][0],dp[i-1][j-1][0])+a[i][j] ,dp[i][j][1] = \max(\max(dp[i-1][j][1],dp[i-1][j-1][1])+a[i][j]),\max(dp[i-1][j][0],dp[i-1][j-1][0])+rowmax[i]) 。 -
从第
n + 1 行到第2 × n - 1 行(列数递减),状态转移方程跟上面的没啥两样,建议自己想,实在想不出来看这。
这里面的
最后取
#include <bits/stdc++.h>
using namespace std;
int n, ans = 0;
int row[207];
int a[207][207];
int dp[207][207][2];
int main() {
cin >> n;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n + i - 1; j++) {
cin >> a[i][j];
row[i] = max(row[i], a[i][j]);
}
for(int i = 1; i <= n - 1; i++)
for(int j = 1; j <= 2 * n - i - 1; j++) {
cin >> a[i + n][j];
row[i + n] = max(row[i + n], a[i + n][j]);
}
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n + i - 1; j++) {
dp[i][j][0] = max(dp[i - 1][j][0], dp[i - 1][j - 1][0]) + a[i][j];
dp[i][j][1] = max(max(dp[i - 1][j][1], dp[i - 1][j - 1][1]) + a[i][j], max(dp[i - 1][j][0], dp[i - 1][j - 1][0]) + row[i]);
}
for(int i = 1; i <= n - 1; i++)
for(int j = 1; j <= 2 * n - i - 1; j++) {
int w = i + n;
dp[w][j][0] = max(dp[w - 1][j][0], dp[w - 1][j + 1][0]) + a[w][j];
dp[w][j][1] = max(max(dp[w - 1][j][1], dp[w - 1][j + 1][1]) + a[w][j], max(dp[w - 1][j][0], dp[w - 1][j + 1][0]) + row[w]);
}
for(int i = 1; i <= n; i++)
ans = max(ans, dp[n * 2 - 1][i][1]);
cout << ans;
return 0;
}