文章
68
粉丝
691
获赞
26
访问
578.3k
一开始以为是上下左右四个方格想用状态压缩dp,但是m,n太大,有点无措,后来发现是一个地方挖了之后,上下一整行都不可以挖,左右限制相邻位置,这就好搞了。
只要我们能求出每行能得到的最大黄金目将他们放到一个数组ma中,那么在对这个数组用同样的方法求一次最大即可。
采用的dp[0][i]意思是该行内不选第i个元素能获得的最大值,这就形成了一个最优子结构
#define inf 0x3f3f3f3f
#define MAX 205
#define ll long long
#define vec vector<int>
#define P pair<int,int>
int main() {
int m, n, a[MAX][MAX], dp[2][MAX], ma[MAX];
while (cin >> m >> n) {
memset(ma, 0, sizeof(ma));
for (int i = 1; i <= m; i++)
for (int j = 1; j <= n; j++)
cin >> a[i][j];
for (int i = 1; i <= m; i++) {//按行求出每行最高能得到多少
memset(dp, 0, sizeof(dp));//[0][i]:不挖i能带来的最高收益
for (int j = 1; j <= n; j++) {
dp[0][j] = max(dp[0][j - 1], dp[1][j - 1]);
dp[1][j] = max(dp[0][j - 1] + a[i][j], dp[0][j]);
}
ma[i] = max(dp[0][n], dp[1][n]);
}
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= m; i++) {
dp[0][i] = max(dp[0][i - 1], dp[1][i - 1]);
dp[1][i] = dp[0]...
登录后发布评论
暂无评论,来抢沙发