当前位置: 首页 > news >正文

关于网站开发网页上传和网站发布临沂在线做网站

关于网站开发网页上传和网站发布,临沂在线做网站,太仓网站制作网站建设,兰州网站建设搜王道下拉题目链接:牛客--取数游戏2 题目解答区基本都是直接写的dp代码,但对我个人而言还是好难理解,所以凭从左程云老师那里学来的经验,我决定从递归入手。 分析题目,从B数组依次向后取,每次可选择A数组最左或最右…

题目链接:牛客--取数游戏2

题目解答区基本都是直接写的dp代码,但对我个人而言还是好难理解,所以凭从左程云老师那里学来的经验,我决定从递归入手。

分析题目,从B数组依次向后取,每次可选择A数组最左或最右,那么我们只需要知道两种情况的最大值,即可。注意每次选A数组数字后,A数组区间会减小,我们可以基于此构建递归函数。

#include <iostream>
#include <vector>
using namespace std;
vector<int> numsA(1001);
vector<int> numsB(1001);
int func(int i, int j, int k, int n);
int main(){int t;cin >> t;while(t--){int n;cin >> n;for(int i = 0; i < n; i++){cin >> numsA[i];}for(int i = 0; i < n; i++){cin >> numsB[i];}cout << func(0, n - 1, 0, n) << endl;}
}// i表示A数组左边界 j表示A数组右边界
// k表示B数组中所要使用的数字下标
// n表示数组大小
int func(int i, int j, int k, int n){if(k == n - 1){return numsB[k] * numsA[i];}// 选数组左边int res1 = numsB[k] * numsA[i] + func(i + 1, j, k + 1, n);// 选数组右边int res2 = numsB[k] * numsA[j] + func(i, j - 1, k + 1, n);int ans = max(res1, res2);return ans;
}

在此基础上进行记忆化搜索优化。

#include <bits/stdc++.h>
using namespace std;
vector<int> numsA(1001);
vector<int> numsB(1001);
int dp[1001][1001][1001];
int func(int i, int j, int k, int n);
int main(){int t;cin >> t;while(t--){memset(dp, -1, sizeof(dp));int n;cin >> n;for(int i = 0; i < n; i++){cin >> numsA[i];}for(int i = 0; i < n; i++){cin >> numsB[i];}cout << func(0, n - 1, 0, n) << endl;}
}// i表示A数组左边界 j表示A数组右边界
// k表示B数组中所要使用的数字下标
// n表示数组大小
int func(int i, int j, int k, int n){if(dp[i][j][k] != -1){return dp[i][j][k];}if(k == n - 1){return numsB[k] * numsA[i];}// 选数组左边int res1 = numsB[k] * numsA[i] + func(i + 1, j, k + 1, n);// 选数组右边int res2 = numsB[k] * numsA[j] + func(i, j - 1, k + 1, n);int ans = max(res1, res2);dp[i][j][k] = ans;return ans;
}

但是这样使用三维数组会内存超限。考虑到 k 值是随区间大小变化的,即每当A数组区间减小1,k则增大1,所以对于递归函数,k可以由 ij 直接得到,即 k = n - (j - i + 1)。优化后代码如下。

#include <bits/stdc++.h>
using namespace std;
vector<int> numsA(1001);
vector<int> numsB(1001);
int dp[1001][1001];
int func(int i, int j, int n);
int main(){int t;cin >> t;while(t--){memset(dp, -1, sizeof(dp));int n;cin >> n;for(int i = 0; i < n; i++){cin >> numsA[i];}for(int i = 0; i < n; i++){cin >> numsB[i];}cout << func(0, n - 1, n) << endl;}
}// i表示A数组左边界 j表示A数组右边界
// k表示B数组中所要使用的数字下标
// n表示数组大小
int func(int i, int j, int n){if(dp[i][j] != -1){return dp[i][j];}int k = n - (j - i + 1);if(k == n - 1){return numsB[k] * numsA[i];}// 选数组左边int res1 = numsB[k] * numsA[i] + func(i + 1, j, n);// 选数组右边int res2 = numsB[k] * numsA[j] + func(i, j - 1, n);int ans = max(res1, res2);dp[i][j] = ans;return ans;
}

到这里其实就已经AC了,不过,学习算法当然不能止步于此,试着将递归改为迭代。

将二维数组视为表(i 作为列,j 作为行),发现递归边界为对角线,空位由上方和右方决定,根据经验,从右下向左遍历即可,最终 dp[0][n - 1] 即为答案。其实想到这里后,再去回看评论区题解,那些代码就没那么晦涩难懂了。最后代码如下:

#include <bits/stdc++.h>
using namespace std;
vector<int> numsA(1001);
vector<int> numsB(1001);
int dp[1001][1001];
int func(int i, int j, int n);
int main(){int t;cin >> t;while(t--){memset(dp, -1, sizeof(dp));int n;cin >> n;for(int i = 0; i < n; i++){cin >> numsA[i];}for(int i = 0; i < n; i++){cin >> numsB[i];}//cout << func(0, n - 1, n) << endl;// 以 j 为行, i 为列构建dp表用于动态规划// 初始化对角线// k = n - (j - i + 1);for(int i = 0; i < n; ++i){// i = jdp[i][i] = numsA[i] * numsB[n - 1];}for(int i = n - 2; i >= 0; --i){for(int j = i + 1; j < n; ++j){int k = n - (j - i + 1);int res1 = numsB[k] * numsA[i] + dp[i + 1][j];    // 选左边int res2 = numsB[k] * numsA[j] + dp[i][j - 1];    // 选右边dp[i][j] = max(res1, res2);}}cout << dp[0][n - 1] << endl;}
}// i表示A数组左边界 j表示A数组右边界
// k表示B数组中所要使用的数字下标
// n表示数组大小
int func(int i, int j, int n){if(dp[i][j] != -1){return dp[i][j];}int k = n - (j - i + 1);if(k == n - 1){return numsB[k] * numsA[i];}// 选数组左边int res1 = numsB[k] * numsA[i] + func(i + 1, j, n);// 选数组右边int res2 = numsB[k] * numsA[j] + func(i, j - 1, n);int ans = max(res1, res2);dp[i][j] = ans;return ans;
}

http://www.dtcms.com/a/575674.html

相关文章:

  • 网站建设公司使用图片侵权使用者有无责任村网通为每个农村建设了网站
  • 深圳市网站建设外包公司wordpress必须安装插件
  • 网站密码如何找回怎么注册公司名
  • 中国建筑集团公司官网天津seo培训班在哪里
  • 网站开发如何记账个人网站备案填写要求
  • php 数据库 wordpress微信seo是什么意思
  • 互助盘网站建设拼多多怎么设置关键词推广
  • 福建建设执业管理中心网站做桌面端还是网站
  • 做网站能挣钱吗wordpress 表格数据
  • 网站制作建设公司推荐邢台手机网站建设
  • 用dw制作个介绍家乡网站长沙网络公司app
  • 丹阳市制作网站新钥匙石家庄网站建设
  • 上海市建设工程安全质量监督总站网站哪个网站做欧洲旅游攻略好
  • 内部网站建设软件下载wordpress删除站点
  • 建设公司网站要注意什么手机网站无响应
  • 门户网站开发架构网站建设 招标资质要求
  • 邢台精品网站建设wordpress开启ftp
  • 网站搭建者龙岩做网站改版费用
  • 专业做招聘的网站wordpress文章双语
  • 网站暂停怎么做阿里 wordpress 安装
  • 南昌网站建设公司效果做个网站需要多少钱?有没有旧装修要拆
  • 菏泽哪里有做网站的wordpress 页面 html
  • 谷歌seo视频教程福州软件优化网站建设
  • 做100个网站企业网站建设营销
  • 山东做网站公司威海建设集团网站首页
  • 手机网站规划营销型网站建设怎么做营销网站建设
  • 网站建设策划方案书论文wordpress企业网站定制教程 一
  • 网站的seo书籍网站建设规划书
  • 做网站所需要的代码拓者设计吧注册码是永久的吗
  • 湖南网站建设制作公司房屋经纪人网站端口怎么做