赛后写的,动态规划,学长和题解,提供了两种状态设计的思路,都写了下……结果在写第二种的时候,不小心把下标的起点写错了,导致WA了无数发…… 无奈啊……每次都是这种错误……

题意:

  大概就是有n块石头,每块石头有两个值ai和bi,其中ai是价值。要求你从中选任意块,获得的价值最大。

  但是,每当你选了一块石头,此时没有被你选到得石头的价值都会剪掉这块石头的bi。

思路:

  首先,可以证明,如果被选,bi小的肯定被先选。因为,如果某两块石头,bi大的先选了;那么交换这两块石头的选取顺序,可以得到更大的价值。

  因此,我们可以把所有的石头按照bi排序。这样子来贪心。

接下来是动态规划:

  状态1:dp[i][j]表示 选取到第i个石头,选到的bi总和是j。 这样的话,在选取下一个石头的时候,那个石头的 ai - j 才是它能获得的价值。

  这种解法下的代码:

 #include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; const int MAXN = ; struct node {
int a, b;
bool operator < (const node & x) const {
return b < x.b;
}
}a[MAXN]; int n;
int dp[MAXN]; ///dp[i][j] int main() {
#ifdef Phantom01
// freopen("WHU1538.txt", "r", stdin);
#endif // Phantom01 while (scanf("%d", &n)!=EOF) {
if (==n) break; for (int i = ; i < n; i++)
scanf("%d%d", &a[i].a, &a[i].b);
sort(a, a+n);
memset(dp, , sizeof(dp));
for (int i = ; i < n; i++) {
for (int j = MAXN-; j >= ; j--) {
if (a[i].b+j <= )
dp[a[i].b+j] = max(dp[a[i].b+j], dp[j]+a[i].a-j);
else
dp[] = max(dp[], dp[j]+a[i].a-j);
}
}
int ans = ;
for (int i = ; i < MAXN; i++)
ans = max(ans, dp[i]);
printf("%d\n", ans);
} return ;
}

Solution 1

  状态2:dp[i][j]表示 选到第i个石头,后面还要选j块石头。 这样子的话,这块石头在整个过程中能够提供的价值是 ai - J * bi

  代码:

 #include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; const int MAXN = ; struct node {
int a, b;
bool operator < (const node &x) const {
return b < x.b;
}
}a[MAXN]; int n;
int dp[MAXN]; int main() {
#ifdef Phantom01
freopen("1538_1.in", "r", stdin);
#endif // Phantom01 while (scanf("%d", &n)!=EOF) {
if (==n) break; memset(dp, , sizeof(dp));
for (int i = ; i < n; i++)
scanf("%d%d", &a[i].a, &a[i].b);
sort(a, a+n);
for (int i = ; i < n; i++) {
for (int j = ; j <= n; j++) {
dp[j] = max(dp[j], dp[j+]+a[i].a-j*a[i].b);
}
}
printf("%d\n", dp[]);
} return ;
}

Solution 2

WHU 1538 Stones II 动态规划的更多相关文章

  1. WOJ 1538 Stones II 转化背包问题

    昨天是我负责这个题目的,最后没搞出来,真的给队伍拖后腿了. 当时都推出来了 我假设最后结果是取了m个物品,则我把这个m个物品按取的先后编号为 k1 k2 k3 k4...km 则最终结果就是 (k1. ...

  2. whu 1538 - B - Stones II 01背包

    题目链接: http://acm.whu.edu.cn/land/problem/detail?problem_id=1538 Problem 1538 - B - Stones II Time Li ...

  3. WOJ 1538 B - Stones II

    Problem 1538 - B - Stones IITime Limit: 1000MS Memory Limit: 65536KB Total Submit: 416 Accepted: 63 ...

  4. Problem 1538 - B - Stones II 贪心+DP

    还是给你石头n枚,每一枚石头有两个值a和b,每取一个石头,除了这块石头其余所有的石头的a就都减去这个石头的b,问你取了的石头的a的总和最大可以为多少? 先按B从大到小排序 然后DP: 取的话:dp[i ...

  5. LEETCODE —— Unique Paths II [动态规划 Dynamic Programming]

    唯一路径问题II Unique Paths II Follow up for "Unique Paths": Now consider if some obstacles are ...

  6. BZOJ 3462 DZY Loves Math II ——动态规划 组合数

    好题. 首先发现$p$是互质的数. 然后我们要求$\sum_{i=1}^{k} pi*xi=n$的方案数. 然后由于$p$不相同,可以而$S$比较小,都是$S$的质因数 可以考虑围绕$S$进行动态规划 ...

  7. WHU 1537 Stones I

    题目见: http://acm.whu.edu.cn/land/problem/detail?problem_id=1537 这个题相当无语,学长给的解法是:枚举取的个数k,然后对每个k贪心,取其中的 ...

  8. 不同路径II --动态规划

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). 现在考虑网 ...

  9. [LeetCode] 198. 打家劫舍II ☆☆☆(动态规划)

    描述 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的 ...

随机推荐

  1. 《汇编语言(第三版)》pushf 和 popf 指令,以及标志寄存器在 Debug 中的表示

    pushf 和 popf pushf 的功能是将标志寄存器的值压栈,而 popf 是从栈中弹出数据,输入标志寄存器. pushf 和 popf,为直接访问寄存器提供了方法. 格式 pushf popf ...

  2. RXjava的简介

    API 介绍和原理简析 1. 概念:扩展的观察者模式 观察者模式面向的需求是:举一个例子,警察在小偷实施作案的时候实施抓捕,在这一个例子中警察是观察者,小偷是被观察者.但是程序的观察者模式和这个还是有 ...

  3. JavaScript学习——使用JS完成省市二级联动

    1.我们希望在注册页面中添加一个字段(籍贯),当用户选择一个具体的省份,在后面的下拉列表中动态加载该省份下所有的城市.显示的效果如下: 2.步骤分析: 第一步:确定事件(onchange)并为其绑定一 ...

  4. [转]C++ 获取文件夹下的所有文件名

    转自http://www.cnblogs.com/fnlingnzb-learner/p/6424563.html 头文件:#include<io.h> char * filePath = ...

  5. (转)Hadoop Eclipse开发环境搭建

    来源:http://www.cnblogs.com/justinzhang/p/4261851.html This document is from my evernote, when I was s ...

  6. IE模式下EasyUI Combobox无效问题

    近期开发过程中遇到IE浏览器Combobox无法正常加载问题. 经过一番百度说IE渲染过快导致页面渲染完了easyUI Combobox还没有加载.设置延迟加载后依旧无效. 后将input标签的Cla ...

  7. bootstrap 因跳页黑色背景无法关闭

    只需要在跳页之前加上如下代码: $(".modal-backdrop").remove();

  8. 【Python常见问题总结】

    1. python2 中 end = '' 取消换行没有用 解决办法: 在程序开始加入 from __future__ import print_function 2. 如何在电脑上同时使用pytho ...

  9. C语言声明语句

    设计理念: C语言的一个设计理念就是声明变量和使用变量的形式应该是一致的 优点:声明变量和使用变量时的运算符优先级是相同的 缺点:运算符的优先级是C语言过度解析的部分之一 术语: 变量声明中使用到的符 ...

  10. python list set dict的简单应用示例

    list.count(x):返回指定元素x在列表中出现的次数 set(list):将list类型变量转换为set类型,去除重复值 dick:保存键值对 x=[1,2,2,3,3] s1=set(x) ...