还是给你石头n枚,每一枚石头有两个值a和b,每取一个石头,除了这块石头其余所有的石头的a就都减去这个石头的b,问你取了的石头的a的总和最大可以为多少?

先按B从大到小排序

然后DP:

取的话:dp[i][j]=dp[i-1][j-1]+a[i]-b[i]*(j-1) 注意是j-1

不取的话:dp[i][j]=dp[i-1][j];

#include<iostream>
#include<cmath>
#include<cstdio>
#include<sstream>
#include<cstdlib>
#include<string>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<ctime>
#include<bitset>
#define eps 1e-6
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define ll __int64
#define LL long long
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#define M 1000000007
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
#define Maxn 1100
struct Inf
{
int a,b;
}save[Maxn];
LL dp[Maxn][Maxn];
int n;
LL Max(LL a,LL b)
{
return a>b?a:b;
}
bool cmp(struct Inf a,struct Inf b)
{
return a.b>b.b;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout); while(scanf("%d",&n)&&n)
{
for(int i=;i<=n;i++)
scanf("%lld%lld",&save[i].a,&save[i].b);
sort(save+,save+n+,cmp);
for(int i=;i<=n;i++)
dp[i][]=;
for(int i=;i<=n;i++)
{
for(int j=;j<=i;j++)
dp[i][j]=max(dp[i-][j-]+save[i].a-save[i].b*(j-),dp[i-][min(j,i-)]);
//dp[i][j]=Max(dp[i-1][j],dp[i-1][j+1]+save[i].a-save[i].b*j);
}
LL ans=;
for(int i=;i<=n;i++)
ans=max(ans,dp[n][i]);
printf("%lld\n",ans);
}
return ;
}

另一种状态方程:

dp[i][j]:表示第i堆后还要选j堆能达到的最大值。

dp[i][j]=max(dp[i-1][j],dp[i-1][j+1]+a[i]-b[i]*j) ; //要么选要么不选

//#include<CSpreadSheet.h>

#include<iostream>
#include<cmath>
#include<cstdio>
#include<sstream>
#include<cstdlib>
#include<string>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<ctime>
#include<bitset>
#define eps 1e-6
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define ll __int64
#define LL long long
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#define M 1000000007
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std; #define Maxn 1100 struct Inf
{
int a,b;
}save[Maxn];
LL dp[Maxn][Maxn];
int n; LL Max(LL a,LL b)
{
return a>b?a:b;
} bool cmp(struct Inf a,struct Inf b)
{
return a.b<b.b;
} int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout); while(scanf("%d",&n)&&n)
{
for(int i=;i<=n;i++)
scanf("%lld%lld",&save[i].a,&save[i].b);
memset(dp,-INF,sizeof(dp)); //无效状态
//printf("%d\n",dp[1][1]);
sort(save+,save+n+,cmp); //顺序 肯定对b从小到大比较优
for(int i=;i<=n;i++)
dp[][i]=; for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
dp[i][j]=Max(dp[i-][j],dp[i-][j+]+save[i].a-save[i].b*j); }
printf("%lld\n",dp[n][]); }
return ;
}

最新文章

  1. Spring 02多种注入方式和注解实现DI
  2. Android test---robotium----简单例子
  3. 【leetcode】atoi (hard) ★
  4. http协议读书笔记2-连接管理
  5. 剑指OFFER之包含min函数的栈(九度OJ1522)
  6. 【转】Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析
  7. 高吞吐koa日志中间件
  8. CSS3新增伪类汇总
  9. es6重点笔记:对象
  10. springboot--springboot+mybatis多数据源最简解决方案
  11. vue踩坑记录:[Vue warn]: $attrs is readonly.
  12. 野路子Java开发的一篇随笔
  13. 6.cookie、session,localStorage、sessionStorage
  14. linux:rsync + inotifywait 实现【准实时】同步
  15. [转]jsbsim基础概念
  16. PAT 1027 Colors in Mars
  17. [buaa-SE-2017]个人作业-Week1
  18. 反Nim博弈
  19. jquery中 $ 和 jQuery 及 $() 的区别
  20. RHEL7 -- 修改主机名

热门文章

  1. 算法 - DNA搜索 - Ako Corasick
  2. Python的环境的搭建
  3. nodejs之express中间件cookie-parser使用
  4. iOS 图表工具charts之CombinedChartView
  5. ATP检测 BAPI BAPI_MATERIAL_AVAILABILITY
  6. windows上使用curl删除和查看ES索引
  7. pandas的.columns和.index
  8. USACO4.3 Buy Low, Buy Lower【简单dp&#183;高精度】
  9. mysql——触发器——概念
  10. IDEA 如何批量修改变量名