Codeforces 1154F (DP)】的更多相关文章

题意:有一个人去买铲子,他需要买正好k把.每把铲子有个标价,并且每把铲子最多只能被买一次.有m种优惠方案,每个优惠方案xi, yi是指如果这次恰好购买了xi把铲子,那么这次购买的铲子中最便宜的yi把将免费.问买k把铲子的最少花费.题目可以分多次购买铲子,只要购买的铲子总数是k把就可以.买过的铲子就不能再买了. 思路:显然,我们需要先对铲子的售价排个序,然后实际上购买的铲子就是最便宜的k把铲子,因为题目中要求购买恰好k把铲子,不能多,所以不存在去购买多余的铲子去凑优惠这种方案.那么现在的问题就变成…
题目链接: http://codeforces.com/contest/1154/problem/F 题意: 有$n$个物品,$m$条优惠 每个优惠的格式是,买$x_i$个物品,最便宜的$y_i$个物品免费 每条优惠可以无限次使用(当时以为每个优惠只能用一次) 可以买一个物品,不参与优惠 求买k个物品的最低花费 数据范围: $1 \le n, m \le 2 \cdot 10^5, 1 \le k \le min(n, 2000)$$1 \le a_i \le 2 \cdot 10^5$$1 \…
题目链接:https://codeforces.com/contest/1154/problem/F 题解: 首先,可以确定的是: 1.$(x,y)$ 里 $x>k$ 的都不可能用: 2.肯定买的是 $n$ 个铲子里,价格前 $k$ 小的铲子. 然后,我们用 $f[i]$ 表示买前 $i$ 个铲子,最多可以优惠掉多少钱. 我们假设 $g[x]$ 代表买 $x$ 个铲子,最多可以不用付 $g[x]$ 个铲子的钱.得到状态转移方程: $f[i] = \min_{j=0}^{i-1}(f[j]+\su…
题目链接:http://codeforces.com/problemset/problem/1154/F 题目大意: 商店有n把铲子,欲购k把,现有m种优惠,每种优惠可使用多次,每种优惠(x, y)表示一次买满x把可使其中最便宜的y把免费.就正好购买k把的最小花费. 分析: 由于要正好购买k把铲子,我们只需要关注n把铲子中价格偏小的k把即可,同时满减优惠如果要买的数量大于k的优惠也不用管. 设dp[i]为购买i把铲子的最大优惠额度. 显然有dp[0] = 0. 为了便于计算某个区间内的优惠,我们…
https://codeforces.com/problemset/problem/813/D dp[i][j] = 一条链以i结尾, 另一条链以j结尾的最大值 关键要保证转移时两条链不能相交 #include <iostream>#include <cstdio> #define REP(i,a,n) for(int i=a;i<=n;++i) using namespace std; , M = 1e7+; int n; int a[N], dp[N][N], x[M],…
Consecutive Subsequence CodeForces - 977F 题目大意:输出一序列中的最大的连续数列的长度和与其对应的下标(连续是指 7 8 9这样的数列) 解题思路: 状态:把dp[i]定义为数列末尾为 i 的最大连续数列的长度值 状态转移方程:dp[i] = dp[i-1] + 1 再由最大连续数列最后一个值从后往前倒推出前面的所有值,到不是连续时停止 代码: #include<bits/stdc++.h> using namespace std; + ; int d…
1.(467C)http://codeforces.com/problemset/problem/467/C 题意:有一个长为n的序列,选取k个长度为m的子序列(子序列中不能有位置重复),求所取的k个序列求和的最大值是多少 分析:设dp[i][j]在[j,n]范围内取了i个子序列求和所得的最大值,用sum[i]表示[1,i]的求和.转移方程为dp[i][j]=max(dp[i-1][j+m]+sum[j+m-1]-sum[j-1],dp[i][j+1]),表示要不要选择[j,j+m-1]这段为其…
/* 题意:给你一个有向无环图.给一个限定t. 问从1点到n点,在不超过t的情况下,最多可以拜访几个点. 保证至少有一条路时限不超过t. 思路: 1.由无后向性我们可以知道(取决于该图是一个DAG),这题一定可以dp. 2.dp[i][j]代表,到达点i,并且拜访了j个城市的最短时间. wa点: 没有初始化数组中的0.. */ #include<bits/stdc++.h> #define N 5050 using namespace std; int inf=0x3f3f3f3f; int…
题目:这里 题意:给定n个字符串,每个字符串可以进行一项操作,就是将这个字符串交换,就是该字符串的第一个和最后一个交换,第二个和倒数第二个交换,以此类推,当然可以选择对于 该字符串进行或不进行这项操作,而每个字符串都有一个相应的能量值,进行操作了就要消耗那么多能量值,最后是否能在消耗的能量值最小的情况下保证这些字符串是升序的( 字典序从小到大),不能就输出-1. 字符串用string,DP,dp[i][j]表示到第i个字符串的状态为j的时候(j为1表示这个串交换了,j为0表示这个串没有交换),注…
/* 题意:给一个长度不超过5000的字符串,每个字符都是0到9的数字. 要求将整个字符串划分成严格递增的几个数字,并且不允许前导零. 思路: 1.很开心得发现,当我在前i个区间以后再加一个区间的时候,转移 的条件只跟最后一个区间的数字大小有关,这决定这道题可以dp... 2.dp[i][j]代表前j个字符,最后划分的区间的第一个字符是第i个的答案数. 3.可知对于所有的dp[i][i...n]他们的答案都取决与dp[1...i-1][i-1]. 4.很容易想到对于同一个i,累加求得dp[i][…