A. Journey Planning(1320A)(贪心)

A. Journey Planning(1320A)(贪心)


题目来源:A. Journey Planning


题意:

给出一个长度为 n 的数组 x,寻找一个上升子序列,该子序列需要满足

  • i - j = x[i] - x[j]
  • 在第一个条件满足的情况下,子序列的和最大

求最大的和为多少


思路:

首先在满足的序列中,比如 x[1], x[2], x[4], x[6],那么我们一定是将这四个数全选,而不是选一部分。

根据题意我们可以把 i - j = x[i] - x[j] 转化为 x[i] - i = x[j] - j, 那么我们令 y = x[i] - i,最后只需要维护 y 的值即可,由于 y 还存在负值,存入 map 就行了,最后取max(map)


AC代码

#include <bits/stdc++.h>
#define endl "\n"
#define rep(i, m, n) for (int i = (m); i <= (n); ++i)
#define rrep(i, m, n) for (int i = (m); i >= (n); --i)
#define IOS ios::sync_with_stdio(0); cin.tie(0);
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = +10, mod = 1e9 + 7;
int n, x[N];
map<int, ll> mp;
void solve() {
	scanf("%d", &n);

	rep(i, 1, n) {
		int a; scanf("%d", &a);
		mp[a - i] += a;
	}

	ll ans = 0;
	for (auto& op : mp) ans = max(ans, op.second);
	printf("%lld\n", ans);
}
int main() {
	solve();
	return 0;
}

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值