文章

68

粉丝

691

获赞

26

访问

575.7k

头像
注意看题
P1676 中南大学2017年机试题
发布于2020年6月3日 12:34
阅读数 9.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]...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发