leedcode-1563. 石子游戏 V

思路一:(区间dp)
dp[i][j] 表示合并区间 i ~ j 所能获得的最大收益
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | class Solution { public : int a[505]; int dp[505][505]; int stoneGameV(vector< int >& stoneValue) { int len = stoneValue.size(); for ( int i = 1; i <= len; i++) { a[i] = stoneValue[i-1]; a[i] += a[i-1]; } for ( int ls = 2; ls <= len; ls++){ // 长度 for ( int i = 1; i <= len; i++) { // 左端 int j = i + ls - 1; //右端 if (j > len) break ; for ( int k = i; k < j; k++){ int sum_l = a[k] - a[i-1]; int sum_r = a[j] - a[k]; if (sum_l > sum_r) dp[i][j] = max(dp[i][j], dp[k+1][j] + sum_r); else if (sum_l < sum_r) dp[i][j] = max(dp[i][j], dp[i][k] + sum_l); else dp[i][j] = max(dp[i][j], max(dp[i][k]+sum_l, dp[k+1][j]+sum_r)); } } } return dp[1][len]; } }; |
思路二:(记忆化搜索)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | class Solution { public : int sum[505]; int dp[505][505]; int dfs( int l, int r){ if (l >= r) return 0; if (dp[l][r]) return dp[l][r]; int ans = 0; for ( int i = l; i < r; i++){ int s1 = sum[i]-sum[l-1]; int s2 = sum[r]-sum[i]; if (s1 < s2) ans = max(ans, s1 + dfs(l, i)); else if (s1 > s2) ans = max(ans, s2 + dfs(i+1, r)); else ans = max(ans, max(dfs(l, i), dfs(i+1, r))+s1); } return dp[l][r] = ans; } int stoneGameV(vector< int >& stoneValue) { sum[1] = stoneValue[0]; for ( int i = 1; i < stoneValue.size(); i++) { sum[i+1] = sum[i] + stoneValue[i]; } int len = stoneValue.size(); return dfs(1, len); } }; |
作者:静默虚空
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
东北日出西边雨 道是无情却有情
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
2018-06-08 区间dp - 括号匹配并输出方案