动态规划:数字游戏
2017-10-17 22:26
155 查看
问题描述:
给定N个序列a1,a2,a3,……,aN,假设你有M次机会,每次你从中拿走一个数,然后剩下的每个数字ai都要减去一个值bi,请求出你能获得的最大的数字之和。
分析:我们知道拿走数字是有顺序的,如果可以规定一个顺序,就可以使用动态规划了.
我们知道要使得拿走数字总和最大,我们就要按b[i]大的先拿走。所以我们可以首先使用结构体来定义数据结构, 然后按照b[i]从大到小的顺序排序,排序后拿走的顺序就是从左到右的,
我们定义f[i][j]表示从前i个数删除j个数的得到的最大值.
方程为:
f[i][j]=max{f[i-1][j],f[i-1][j-1]+a[i]-b[i]*(j-1)};
给定N个序列a1,a2,a3,……,aN,假设你有M次机会,每次你从中拿走一个数,然后剩下的每个数字ai都要减去一个值bi,请求出你能获得的最大的数字之和。
分析:我们知道拿走数字是有顺序的,如果可以规定一个顺序,就可以使用动态规划了.
我们知道要使得拿走数字总和最大,我们就要按b[i]大的先拿走。所以我们可以首先使用结构体来定义数据结构, 然后按照b[i]从大到小的顺序排序,排序后拿走的顺序就是从左到右的,
我们定义f[i][j]表示从前i个数删除j个数的得到的最大值.
方程为:
f[i][j]=max{f[i-1][j],f[i-1][j-1]+a[i]-b[i]*(j-1)};
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; const int maxn=1000; int n,m; int dp[maxn][maxn]; struct num{ int a; int b; }; struct num Num[maxn]; bool cmp(struct num x,struct num y){ return x.b>y.b; } int main(){ cin>>n>>m; int i,j; for(i=1;i<=n;i++) cin>>Num[i].a; for(i=1;i<=n;i++) cin>>Num[i].b; memset(dp,0,sizeof(dp)); sort(Num+1,Num+1+n,cmp); for(i=1;i<=n;i++){ dp[i-1][0]=0; for(j=1;j<=m;j++){ dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]+Num[i].a-Num[i].b*(j-1)); } } cout<<dp [m]<<endl; return 0; }`
相关文章推荐
- 动态规划问题数字三角形的(递归程序)
- 博弈论专题——推理与动态规划相关博弈之POJ2484 POJ1740(模仿游戏)
- 算法 -- 数字三角形之动态规划
- OJ-3134 动态规划基础题目之数字三角形
- 动态规划_数字三角形
- 动态规划----数字三角形
- 动态规划--数字三角形问题
- 动态规划(二)暴力递归的优化之路——数字三角形最大路径和
- 动态规划 数字三角形
- 动态规划;多边形游戏;类似圈型石头合并;算法设计分析作业;
- 24点游戏动态规划解法(java)
- 动态规划---多边形游戏
- js算法:动态规划-多边形游戏
- YTU OJ 3134: 动态规划基础题目之数字三角形(Java解题)
- 动态规划之数字三角形
- 动态规划0/1背包问题和数字三角形
- a simple stone game--k倍动态规划减法游戏
- 动态规划之多边形游戏
- 动态规划——求数字三角形最优解和最优路径
- 2985:数字组合(2.6基本算法之动态规划)