2023CCPC河南站 E.矩阵游戏
思路:
高维DP [样本对应模型+类背包问题]
-
空间复杂度分析(需要三维转二维)
- 题目限值: 256MB=256×10e6=2.56×10e8 个int
- 三维: 总需要空间: dp[500][500][1000]:500×500×1000=2.5×10e8 // 太极限了, 同时你还要算上 输入数据的大小, dp要多开10几个, 必然MLE, 所以要优化到二维
- 二维: 总需要空间: dp[500][1000]=500×1000=5×10e5 //远远够
-
时间复杂度分析
- 时间限值: 2s (10e8~10e9) 题目保证 ∑n*m≤2.5×10e5
- 时间限值: 2s (10e8~10e9) 题目保证 ∑n*m≤2.5×10e5
-
思路可行性分析
-
**basic case: **出界返回0,
if(x<1||x>n||y<1||y>m) return 0; // 越界返回空气
-
else:
-
要是为1, 为了使得最大, 就得加上, 再在向右|向下中选择最大值
if(arr[x][y]=='1') return 1+max(way1(x,y+1,rest), way1(x+1,y,rest));
-
要是为0, 在向右|向下中选择最大值
else if(arr[x][y]=='0') return max(way1(x,y+1,rest), way1(x+1,y,rest));
-
要是为?,
- 能换, 当前的rest>=1:
int p1=1+max(way1(x,y+1,rest-1), way1(x+1,y,rest-1));
- 换不了:
int p2=max(way1(x,y+1,rest), way1(x+1,y,rest));
当前换不换, 看最大
return max(p1, p2);
- 能换, 当前的rest>=1:
-
-
代码:
- 尝试(递归)
// 在[x,y]的位置, 有rest步可以变
// 返回值: 走到[n,m]处的最大价值
int way1(int x,int y,int rest) {
if(x<1||x>n||y<1||y>m) return 0; // 越界返回空气
else {
if(arr[x][y]=='1') return 1+max(way1(x,y+1,rest)