您的位置:首页 > 文旅 > 旅游 > 【错题集-编程题】取金币(动态规划 - 区间 dp)

【错题集-编程题】取金币(动态规划 - 区间 dp)

2024/10/5 21:23:48 来源:https://blog.csdn.net/weixin_74531333/article/details/140346696  浏览:    关键词:【错题集-编程题】取金币(动态规划 - 区间 dp)

牛客对应题目链接:取金币_牛客题霸_牛客网 (nowcoder.com)


一、分析题目

  • 区间 dp:为了方便能处理边界情况,将原数组前后添加⼀个 1,并不影响最后相乘的结果。
  • 状态表示:dp[i][j] 表示[i, j] 区间⼀共能获得多少金币。
  • 填表顺序:从下往上,从左往右。

二、代码

//值得学习的代码
class Solution
{int arr[110] = { 0 };int dp[110][110] = { 0 };public:int getCoins(vector<int>& coins) {int n = coins.size();arr[0] = arr[n + 1] = 1;for(int i = 1; i <= n; i++) arr[i] = coins[i - 1];for(int i = n; i >= 1; i--){for(int j = i; j <= n; j++){for(int k = i; k <= j; k++){dp[i][j] = max(dp[i][j], dp[i][k - 1] + dp[k + 1][j] + arr[i - 1] * arr[k] * arr[j + 1]);}}}return dp[1][n];}
};
//牛客
class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param coins int整型vector * @return int整型*/int getCoins(vector<int>& coins) {int n=coins.size();vector<vector<int>> dp(n+2, vector<int>(n+2, 0));vector<int> a(n+2, 0);for(int i = 1; i <= n; i++)a[i]=coins[i-1];a[0]=a[n+1]=1;for(int i=n; i>=1; i--){for(int j=i; j<=n; j++){for(int k=i; k<=j; k++){dp[i][j]=max(dp[i][j], dp[i][k-1]+dp[k+1][j]+a[i-1]*a[k]*a[j+1]);}}}return dp[1][n];}
};

三、反思与改进

找到子问题,就可以知道这道题目考察的是区间 dp。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com