Codeforces Round 932 (Div. 2)C. Messenger in MAC 有序简化题目,dp,dp优化

Problem - C - Codeforces

目录

题意:

思路:

状态转移方程:

参考代码:


题意:

给两个长度为n数组a,b,和整数 l

任取若干下标,使得这个式子

不超过 l 的最多下标数。

思路:

可以根据右侧部分排好序依次减。

所以我们先对数组排序,按b的大小排。

然后用动态规划求 下标 i 之前 取 j 个 的最小值。

dp [ i ] [ j ]  =  dp [ k ] [ j -1 ]  + a[ i ] + b[ i ] - b[ k ]

k是指 i 之前的,取 j - 1个时的最小dp的下标。

但是这里有个k就三维了,不过我们可以这样优化:

 dp [ i ] [ j ]  =  dp [ k ] [ j -1 ] - b[ k ] + a[ i ] + b[ i ]

用 g[ j-1 ] = dp[ k ][j - 1] - b[ k ]

即 g[ j ] = dp[ k ][ j ] - b[ k ]

代表此前取 j 次最小的dp[ k ][ j ] - b[ k ]

我们在dp的过程中一直维护这个g[ j ]即可。

所以

状态转移方程:

dp [ i ] [ j ]  = g[ j ] + a[ i ] + b[ i ]

然后就可以去找数目最多的小于 l 的结果了。

参考代码:

注意dp时不能先次数再下标,因为本次可能为了更小,取了更靠后的数。。


#include<bits/stdc++.h>

using namespace std;

#define ll long long
#define endl "\n"
#define int long long
const ll inf = 1e9;
const ll MOD = 0x77777777737;
const int maxn = 1e9;
int dp[2003][2003];
void solve()
{
	int n, l;
	cin >> n >> l;
	vector<int>a(n), b(n),c(n),g(n+1);
	for (int i = 0; i < n; i++)
	{
		cin >> a[i] >> b[i];
	}
	iota(c.begin(), c.end(),0);
	sort(c.begin(), c.end(), [&](int l,int r)
		{
			return b[l] < b[r];
		});
	

	for (int i = 1; i <= n; i++)
		g[i] = LLONG_MAX;
	for (int i = 0; i < n; i++)
	{
		for (int j = i+1; j > 1; j--)//个数
		{
			//dp[i][j] = dp[k][j-1]-b[k]+a[c[i]]+b[c[i]];
			dp[i][j] = g[j-1]+a[c[i]]+b[c[i]];
			g[j] = min(dp[i][j] - b[c[i]],g[j]);
		}
		dp[i][1] = a[c[i]];
		g[1] = min(g[1],a[c[i]] -b[c[i]]);
	}



	//再用g去统计一下答案
	for (int i = 1; i <= n; i++)
		g[i] = LLONG_MAX;
	for (int i = 0; i < n; i++)
	{
		for (int j = i + 1; j >= 1; j--)//个数
		{
			g[j] = min(g[j], dp[i][j]);
		}
	}

	for (int i = n; i >= 0; i--)
	{
		if (g[i] <= l)
		{
			cout << i << endl;
			return;
		}
	}
}
signed main()
{
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int t = 1;
	cin >> t;
	while (t--)
	{
		solve();
	}
	return 0;
}


相关推荐

  1. codeforce#939 (div2) 题解

    2024-03-14 16:20:02       23 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-14 16:20:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-14 16:20:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-14 16:20:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-14 16:20:02       18 阅读

热门阅读

  1. uni-app网络请求封装及发送

    2024-03-14 16:20:02       22 阅读
  2. HTML本地离线缓存?

    2024-03-14 16:20:02       18 阅读
  3. Android apk 打包及签名

    2024-03-14 16:20:02       22 阅读
  4. 有效的正方形(LeetCode 593)

    2024-03-14 16:20:02       23 阅读
  5. leetcode 2864.最大二进制奇数

    2024-03-14 16:20:02       21 阅读
  6. 力扣爆刷第94天之hot100五连刷56-60

    2024-03-14 16:20:02       21 阅读
  7. 如何将服务器数据迁移到另一台服务器?

    2024-03-14 16:20:02       18 阅读
  8. ECMAScript 语法

    2024-03-14 16:20:02       21 阅读
  9. 安装antv

    2024-03-14 16:20:02       17 阅读
  10. C#处理文件

    2024-03-14 16:20:02       18 阅读
  11. el-menu + el-badge 菜单加红点标识el-badge

    2024-03-14 16:20:02       21 阅读
  12. 精读《寻找框架设计的平衡点》

    2024-03-14 16:20:02       19 阅读
  13. SpringBoot有哪些优缺点呢

    2024-03-14 16:20:02       17 阅读
  14. Compound Words(UVA 10391)

    2024-03-14 16:20:02       22 阅读