【每日一题】7月29日题目精讲—Max Power

Max Power

https://ac.nowcoder.com/acm/problem/20663

思路:
首先,每一列如果要学应该是学一个从上到下的连续区间,第二,当前这一列最多比右边的那一列多学一个——所以,考虑从右往左一列一列转移:
f[i][j][k]表示前i列一共选了k个技能学,第i列选了连续的前j个,
f[i][j][k] = max(f[i-1][p][k-j] + sum[i][j])
其中:sum[i][j]是列前缀和,表示第i列前j个数字的和;p从j-1枚举到n-i+1枚举,即第i-1列最少只比第i列少选一个(最多则可以选完)。
#include<bits/stdc++.h>
using namespace std;
int sum1[105];int n,m;
int sum2[105][105];
long long dp[56][56][1305];//这个空间把握的死死的,开到60就超限,开51,52还一直wa,没想到错这。。。。。。。。。。。。
long long ans = 0;
void solve() {
	ans = 0;
	for (int i = n; i >= 1; i--) {
		for (int j = 0; j <= n - i + 1; j++) {
			for (int k = sum1[j]; k <= m; k++) {
				for (int l = max(j-1,0 ); l < n - i + 1; l++) {
					dp[i][j][k] = max(dp[i][j][k], dp[i + 1][l][k - j] + sum2[j][i]);//状态转移方程
				}
				ans = max(ans, dp[i][j][m]);
			}
		}
	}
}
int main() {
	while (cin >> n >> m) {
		memset(dp, 0, sizeof(dp));
		for (int i = 1; i <= n; i++) {
			sum1[i] = sum1[i - 1] + i;
			for (int j = 1; j <= n - i + 1; j++) {
				cin >> sum2[i][j];
				sum2[i][j] += sum2[i - 1][j];//列前缀和
			}
		}
        solve();
        cout << ans << endl;
	}
	return 0;
}
我真的是吐了,内存没开够大,找半天没找到错那。。。。。。。。。
这是我见过最恶心最难的dp。。。。。。。。。
毕竟菜的扣脚。

全部评论

相关推荐

点赞 评论 收藏
分享
03-11 10:06
已编辑
河南师范大学 C++
点赞 评论 收藏
分享
03-16 11:19
已编辑
门头沟学院 Java
已经一年没发牛客了,为什么呢,因为没脸发...&nbsp;一年前的我自认为在25届中技术一流,八股无敌,项目出色,但是一年校招的蹉跎让我差点转行。24年春招收割了十几个实习&nbsp;offer&nbsp;之后我去了某家大厂实习到9月份转正失败,那时候的我还没有意识到噩梦将来,7月因为投秋招提前批没反馈,于是开始投了几个实习转正岗位练手又拿了3个中大厂&nbsp;offer,这时的我沉浸在我自以为是的骄傲里。9月秋招正式批开始后我几乎把我能找到的所有的岗位都投了一遍,只收获了大厂海笔,0面试。10月份第一家给我面试的公司是数字马力(蚂蚁的内包),诚恳的说,当时收到这家面试是嚣张的,觉得我拿这个&nbsp;offer&nbsp;如探囊取物,就当个保底吧。...
中街牛奶提子:是啊,不应该在秋招的时候继续投实习岗。也劝26届的,八月末后,实习岗就不应该投,给人错误的行情认知。佬是学院本,觉得约面难,双非何尝不是一样呢,秋招战场的激烈和实习完全不同。当时我秋招的时候也是边面实习,当时面实习面一个过一个觉得自己很优越,觉得能收获一堆实习offer那秋招肯定也行。为什么要在秋招拿一堆实习offer增强自己所谓的虚荣心,当时就是贱,为了所谓的攀比虚荣心
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务