dp - HNU 13404 The Imp

The Imp

Problem‘s Link: http://acm.hnu.cn/online/?action=problem&type=show&id=13404&courseid=0



Mean:

n个物品,每个物品价值为v,价格为c,你只可以带一个物品离开。

有一个精灵,它可以施法让你购买后的物品价值变为0(未离开商店之前),精灵最多施k次法术。

你的目的是让自己获得最大收益,而小鬼的目的正好相反。
如果你和精灵都采用最优策略,最后你可以盈利多少?

analyse:

第一感觉是三维dp,然而三维肯定会超时超内存。
然后就是想怎样压缩状态。。。
想了想其实两维就够了,为什么呢?因为对于第i件物品,如果我不选,那么它这次施不施法是没有影响的。
dp[i][j]:判断到第i个物品,精灵施了j次魔法,我还能获得的最大收益。
状态转移方程:dp[i][j]=max(dp[i-1][j],min(dp[i-1][j-1]-c,v-c))

伪代码:

for_each i
{
   if(select i)
   {
       for_each j
       {
           if(magic j time)
           {
               max(before i) - cost;
           }
           else
           {
               value-cost;
           }
       }
   }
   else
   {
       max(before i);
   }
}

Time complexity: O(N*K)

Source code: 

/*
* this code is made by crazyacking
* Verdict: Accepted
* Submission Date: 2015-08-15-12.09
* Time: 0MS
* Memory: 137KB
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#define  LL __int64
#define  ULL unsigned long long
using namespace std;
const LL MAXN=200010;
struct node
{
     LL v,c;
     bool operator <(const node&a) const
     {
           return v>a.v;
     }
} a[MAXN];
LL dp[MAXN][10];

int main()
{
     ios_base::sync_with_stdio(false);
     cin.tie(0);
     LL Cas;
     scanf("%I64d",&Cas);
     while(Cas--)
     {
           LL n,k;
           scanf("%I64d %I64d",&n,&k);
           for(LL i=1; i<=n; ++i)
           {
                 scanf("%I64d %I64d",&a[i].v,&a[i].c);
           }
           sort(a+1,a+n+1);
           LL ans=0,val;
           memset(dp,0,sizeof dp);
           for(LL i=1; i<=n; ++i)
           {
                 val=a[i].v-a[i].c;
                 dp[i][0]=max(dp[i-1][0],val);
                 for(LL j=1; j<=k; ++j)
                 {
                       dp[i][j]=max(dp[i-1][j],min(dp[i-1][j-1]-a[i].c,val));
                 }
                 ans=max(ans,dp[i][k]);
           }
           printf("%I64d\n",ans);
     }
     return 0;
}
/*

*/

时间: 2024-10-19 11:57:02

dp - HNU 13404 The Imp的相关文章

【AC自动机+DP】HNU 13108 Just Another Knapsack Problem

通道:http://acm.hnu.cn/online/?action=problem&type=show&id=13108&courseid=296 题意:N个匹配串及权值,求完全匹配模式串的最大值. 思路:建AC自动机,dp[i]到达i的最大值,dp[i]=max(dp[i-L]+W); 代码:https://github.com/Mithril0rd/Rojo/blob/master/hnu13108.cpp

HNU 13108-Just Another Knapsack Problem (ac自动机上的dp)

题意: 给你一个母串,多个模式串及其价值,求用模式串拼接成母串(不重叠不遗漏),能获得的最大价值. 分析: ac自动机中,在字典树上查找时,用dp,dp[i]拼成母串以i为结尾的子串,获得的最大价值,dp[i]=max(dp[i],dp[i-len]+val[tmp]).,len是模式串的长度,val[tmp]为其价值. #include <cstdio> #include <cstring> #include <cmath> #include <queue>

HNU OJ10086 挤挤更健康 记忆化搜索DP

挤挤更健康 Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users: 339, Accepted users: 216 Problem 10086 : No special judgement Problem description 用边长小于N的正方形方砖(注意,不要求所有的方砖大小相同,请看样例说明)不重叠地铺满N*N的正方形房间,最少要几块方砖. Input 第一行是一个整

HNU 12961 BitTorrent DP

题意: 你在网上下载东西,一个文件存储在一段或者多段里面,问怎么选择能在规定的流量内下载最多的文件数量.每段的大小一样. 思路: 习惯了做答案保存在DP数组里的题,做这种答案保存在下标里的题,转不过弯来.开始想过背包,但是一来内存不够,二来时间也不够. 其实是这样做的,dp[i][j][0/1]保存枚举到第i个,下载了j个,最后一个是否被下载的最小花费. 最后找花费没超过限制的最大值就好了. 最后值得注意的是,最后一段的时候,可能不会被p整除,不要算多了哦. 代码: 1 #include <io

HNU Cent Savings (DP)

Cent Savings Time Limit: 5000ms, Special Time Limit:12500ms, Memory Limit:65536KB Total submit users: 54, Accepted users: 36 Problem 13345 : No special judgement Problem description To host a regional contest like NWERC a lot of preparation is necess

HNU 13108 Just Another Knapsack Problem DP + Trie树优化

题意: 给你一个文本串,和一些模式串,每个模式串都有一个价值,让你选一些模式串来组成文本串,使获得的价值最大.每个模式串不止能用一次. 思路: 多重背包,枚举文本串的每个位置和模式串,把该模式串拼接在当前位置,看下一个位置是否能得到更优值.但是,存在很多模式串不能拼在当前位置的,无效状态.所以可以用Trie树来优化转移. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <c

莫比乌斯反演 - HNU 13412 Cookie Counter

Cookie Counter Problem's Link: http://acm.hnu.cn/online/?action=problem&type=show&id=13412&courseid=0 Mean: 将N分为D份,每份不超过X,有多少种分法? analyse: 莫比乌斯反演的运用. 首先我们想到的是迭代,但是数据太大,一路迭代下去必定爆栈+超内存+TLE. 那么就需要用莫比乌斯反演来优化多项式求和.我们枚举X,对于满足条件的X,使用莫比乌斯反演求和统计答案,不满足条

expdp\impdp及exp\imp

数据泵文件 expdp介绍 EXPDP命令行选项1. ATTACH该选项用于在客户会话与已存在导出作用之间建立关联.语法如下ATTACH=[schema_name.]job_nameSchema_name用于指定方案名,job_name用于指定导出作业名.注意,如果使用ATTACH选项,在命令行除了连接字符串和ATTACH选项外,不能指定任何其他选项,示例如下:Expdp scott/tiger ATTACH=scott.export_job 2. CONTENT该选项用于指定要导出的内容.默认

[转载]expdp\impdp及exp\imp

expdp\impdp及exp\imp 数据泵文件 expdp介绍 EXPDP命令行选项1. ATTACH该选项用于在客户会话与已存在导出作用之间建立关联.语法如下ATTACH=[schema_name.]job_nameSchema_name用于指定方案名,job_name用于指定导出作业名.注意,如果使用ATTACH选项,在命令行除了连接字符串和ATTACH选项外,不能指定任何其他选项,示例如下:Expdp scott/tiger ATTACH=scott.export_job 2. CON