首页 > 取数游戏2
头像 昵称很长很长真是太好了
发表于 2020-06-26 23:34:06
这个题做的时候发生了一个很搞笑的事情,就是如果你把代码里面的 int a[1011],b[1011]; int dp[1011][1011];调换一下位置,哈,你就会惊喜的发现,段错误。仅限c++11题解:dp[i][j]代表着左边取i个数右边取j个数能获得的最大值。当i+j==n的时候,就可以获得 展开全文
头像 m0moo
发表于 2020-07-14 14:02:51
链接:https://ac.nowcoder.com/acm/problem/14701来源:牛客网 题目描述 给定两个长度为n的整数列A和B,每次你可以从A数列的左端或右端取走一个数。假设第i次取走的数为ax,则第i次取走的数的价值vi=bi⋅ax,现在希望你求出∑vi的最大值。 输入描述 展开全文
头像 2121212
发表于 2020-12-25 21:34:52
并没有很快的想到转移方程,所以就直接搜索吧。(写起来超短的) int dfs(int cur, int l) { if (cur == n + 1) return 0; if (memo[cur][l] != 0) return memo[cur][l]; return me 展开全文
头像 瑜画
发表于 2020-06-11 10:13:24
dp[j][k]用于表示j到k的闭区间,然后逆向扩展区间,从最后一次取数一直扩展到第一次取数。第一次取数的位置一定为最左或最右,即dp[1][n]=max(dp[2][n]+取数,dp[1][n-1]+取数)。问题得到解决。 #include <bits/stdc++.h> using 展开全文
头像 牛客685048100号
发表于 2022-06-23 16:29:13
1.更改石子游戏模板并解析边界值(java代码) //石子游戏模板代码 for(int len = 2;len<=n;len++) //枚举长度 for(int l = 1;l+len-1<=n;l++){ int r = l+len -1; dp[l,r] = INF; 展开全文
头像 游辞
发表于 2023-08-12 15:58:34
取数游戏2 1、原问题:每次能从a的左端或者右端取一个值和取b的最左值相乘后求总和 2、子问题(终态思考): 最小区间取值都与b的最右端相乘后随着len的扩大b值逐渐向左取 3、状态参数:len(从1开始),l,r 4、状态转移方程: dp[l][r] = max(dp[l][r] , dp[l 展开全文
头像 QQQQQQ5292
发表于 2021-07-22 13:35:34
题目描述:给定两个长度为n的整数列A和B,每次你可以从A数列的左端或右端取走一个数。假设第i次取走的数为ax,则第i次取走的数的价值vi=bi⋅ax,现在希望你求出∑vi的最大值。思路与分析:我们定义它在区间[l,r]之间的最大值为dp[l][r]。而dp[l][r]的值是由max(dfs(l+1, 展开全文
头像 牛客532105025号
发表于 2023-08-12 15:49:31
取数游戏2 (nowcoder.com) 转移方程: F(i,j)=max(F(i−1,j)+a[i]∗b[n−(j−i)],F(i,j−1)+a[j]∗b[n−(j−i)])F(i,j) = max(F(i-1,j) + a[i]*b[n - (j - i)], F(i,j-1) + a[j]*b 展开全文
头像 CUMT21曾虹荐
发表于 2022-03-09 19:30:54
学到动态规划学到后面反而忘了他最重要的本质, 动态规划的本质是一个状态和一个状态之间的转换。 本来开了个三维数组dp[i][j][k],代表的是从左拿了个,从右拿了j个,现在是第几个,其实简化后就成了dp[i][j]。 代码中的实现在两层循环可以实现,第一层枚举现在一共选了n个数,然后第二层枚举从左 展开全文
头像 Severus.
发表于 2020-07-07 17:30:54
题目描述 给定两个长度为n的整数列A和B,每次你可以从A数列的左端或右端取走一个数。假设第i次取走的数为ax,则第i次取走的数的价值vi=bi⋅ax,现在希望你求出∑vi的最大值。 输入描述: 第一行一个数T,表示有T组数据。对于每组数据,第一行一个整数n,接下来两行分别给出A数列与B数列。 展开全文