蓝桥杯 求最大值 dp
2016-11-09 19:16
190 查看
这题很暴力的一个DP,d[i][j]表示前i个数对选择一些Ai的和为j的最大Bi和。
状态转移方程:
dp[i][j]=max(dp[i][j],dp[i-1][j-sc[i].a]+sc[i].b);
AC代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int inf=1<<28;
const int maxn=200002;
int dp[101][maxn];
struct node{
int a,b;
}sc[101];
int main(){
int n;
while(scanf("%d",&n)==1){
for(int i=1;i<=n;++i){
scanf("%d%d",&sc[i].a,&sc[i].b);
}
for(int i=0;i<=n;++i)
for(int j=0;j<maxn;++j)
dp[i][j]=-inf;
int ab=100000;
for(int i=1;i<=n;++i){
dp[i][ab+sc[i].a]=sc[i].b;
for(int j=0;j<maxn;++j){
dp[i][j]=max(dp[i-1][j],dp[i][j]);
if(j-sc[i].a<=200000&&j-sc[i].a>=0)
dp[i][j]=max(dp[i][j],dp[i-1][j-sc[i].a]+sc[i].b);
}
}
int ans=0;
int ind;
for(int i=ab;i<maxn;++i){
if(dp
[i]>=0&&dp
[i]+i-ab>ans) {
ans=dp
[i]+i-ab;
}
}
printf("%d\n",ans);
}
return 0;
}
这个代码有两个可以优化的地方,第一个就是每次可以先把Ai和算出来,避免太多次的运算,空间上能够用滚动数组优化。
如有不当之处欢迎指出!
状态转移方程:
dp[i][j]=max(dp[i][j],dp[i-1][j-sc[i].a]+sc[i].b);
AC代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int inf=1<<28;
const int maxn=200002;
int dp[101][maxn];
struct node{
int a,b;
}sc[101];
int main(){
int n;
while(scanf("%d",&n)==1){
for(int i=1;i<=n;++i){
scanf("%d%d",&sc[i].a,&sc[i].b);
}
for(int i=0;i<=n;++i)
for(int j=0;j<maxn;++j)
dp[i][j]=-inf;
int ab=100000;
for(int i=1;i<=n;++i){
dp[i][ab+sc[i].a]=sc[i].b;
for(int j=0;j<maxn;++j){
dp[i][j]=max(dp[i-1][j],dp[i][j]);
if(j-sc[i].a<=200000&&j-sc[i].a>=0)
dp[i][j]=max(dp[i][j],dp[i-1][j-sc[i].a]+sc[i].b);
}
}
int ans=0;
int ind;
for(int i=ab;i<maxn;++i){
if(dp
[i]>=0&&dp
[i]+i-ab>ans) {
ans=dp
[i]+i-ab;
}
}
printf("%d\n",ans);
}
return 0;
}
这个代码有两个可以优化的地方,第一个就是每次可以先把Ai和算出来,避免太多次的运算,空间上能够用滚动数组优化。
如有不当之处欢迎指出!
相关文章推荐
- 蓝桥杯 最大子阵 dp (类最大连续子段和)
- 蓝桥杯 最大子阵_dp
- 蓝桥杯 -- 历届试题 最大子阵 【DP】
- 动态规划——看似dp的贪心问题最大乘积(蓝桥杯试题集)
- 蓝桥杯——最大的算式——DP
- 蓝桥杯 最大子阵(dp最大子段和)
- 蓝桥杯 - 历届试题 - PREV-26 - 最大子阵 (最大子矩阵和,dp)
- 蓝桥杯 算法训练 最大的算式(DP)
- 蓝桥杯 最大子阵 (DP)
- 蓝桥杯 算法训练 乘积最大 dp
- 蓝桥杯 最大公共子串长度 动态规划 dp
- dp1--乘积最大
- 【dp】最大报销额
- 蓝桥杯 算法训练 K好数(DP C++)
- hdu 1231 dp 最大连续子序列
- HAUT 1266 最大子段和(类似DP)(河南工业大学2017校赛)
- 最大连续子序列(DP)
- Matrix Swapping II(DP,最大矩形问题)
- 51nod 1052 最大M子段和 (区间dp)
- 51Nod 1049 最大子段和(分治/dp)