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;
}