Codeforces Round #286 (Div. 1) A. Mr. Kitayuta, the Treasure Hunter DP

链接:

http://codeforces.com/problemset/problem/506/A

题意:

给出30000个岛,有n个宝石分布在上面,第一步到d位置,每次走的距离与上一步的差距不大于1,问走完一路最多捡到多少块宝石。

题解:

容易想到DP,dp[i][j]表示到达 i 处,现在步长为 j 时最多收集到的财富,转移也不难,cnt[i]表示 i 处的财富。

dp[i+step-1] = max(dp[i+step-1],dp[i][j]+cnt[i+step+1])

dp[i+step] = max(dp[i+step],dp[i][j]+cnt[i+step])

dp[i+step+1] = max(dp[i+step+1],dp[i][j]+cnt[i+step+1])

但是步长直接开30000存的话肯定是不行的,又发现,其实走过30000之前,步长的变化不会很大,如果步长每次增加1的话,那么最少1+2+...+n=n(n+1)/2 > 30000, n<250,即步长变化不会超过250.所以第二维保存相对原始步长的改变量,-250~250,开500就够了,这样就不会MLE了。

代码:

31 int n, d;
32 int a[MAXN];
33 int dp[MAXN][500];
34
35 int main() {
36     ios::sync_with_stdio(false), cin.tie(0);
37     cin >> n >> d;
38     while (n--) {
39         int x;
40         cin >> x;
41         a[x]++;
42     }
43     memset(dp, -1, sizeof(dp));
44     dp[d][250] = a[d];
45     int ans = a[d];
46     rep(i, d, 30001) rep(j, 1, 500) {
47         if (dp[i][j] == -1) continue;
48         int to = i + d + j - 250;
49         if (to <= 30000) {
50             dp[to][j] = max(dp[to][j], dp[i][j] + a[to]);
51             ans = max(ans, dp[to][j]);
52         }
53         if (to + 1 <= 30000) {
54             dp[to + 1][j + 1] = max(dp[to + 1][j + 1], dp[i][j] + a[to + 1]);
55             ans = max(ans, dp[to + 1][j + 1]);
56         }
57         if (to <= 30000 && to - i > 1) {
58             dp[to - 1][j - 1] = max(dp[to - 1][j - 1], dp[i][j] + a[to - 1]);
59             ans = max(ans, dp[to - 1][j - 1]);
60         }
61     }
62     cout << ans << endl;
63     return 0;
64 }
时间: 2024-12-19 12:58:37

Codeforces Round #286 (Div. 1) A. Mr. Kitayuta, the Treasure Hunter DP的相关文章

Codeforces Round #286 (Div. 2) C. Mr. Kitayuta, the Treasure Hunter+dp+优化

C. Mr. Kitayuta, the Treasure Hunter time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output The Shuseki Islands are an archipelago of 30001 small islands in the Yutampo Sea. The islands are evenly

Codeforces Round #286 (Div. 2)B. Mr. Kitayuta&#39;s Colorful Graph(dfs,暴力)

数据规模小,所以就暴力枚举每一种颜色的边就行了. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<cmath> #include<map> #include<set> #include<vector> #include<algorithm>

Codeforces Round #286 (Div. 2)A. Mr. Kitayuta&#39;s Gift(暴力,string的应用)

由于字符串的长度很短,所以就暴力枚举每一个空每一个字母,出现行的就输出.这么简单的思路我居然没想到,临场想了很多,以为有什么技巧,越想越迷...是思维方式有问题,遇到问题先分析最简单粗暴的办法,然后一步一步的优化,不能盲目的想. 这道题要AC的快需要熟悉string的各种用法.这里做个简单总结:C++中string的常见用法. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstrin

Codeforces Round #286 (Div. 2) B. Mr. Kitayuta&#39;s Colorful Graph +foyd算法的应用

B. Mr. Kitayuta's Colorful Graph time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Mr. Kitayuta has just bought an undirected graph consisting of n vertices and m edges. The vertices of the g

水题 Codeforces Round #286 (Div. 2) A Mr. Kitayuta&#39;s Gift

题目传送门 1 /* 2 水题:vector容器实现插入操作,暴力进行判断是否为回文串 3 */ 4 #include <cstdio> 5 #include <iostream> 6 #include <algorithm> 7 #include <cstring> 8 #include <string> 9 #include <vector> 10 using namespace std; 11 12 const int MAXN

DFS/并查集 Codeforces Round #286 (Div. 2) B - Mr. Kitayuta&#39;s Colorful Graph

题目传送门 1 /* 2 题意:两点之间有不同颜色的线连通,问两点间单一颜色连通的路径有几条 3 DFS:暴力每个颜色,以u走到v为结束标志,累加条数 4 注意:无向图 5 */ 6 #include <cstdio> 7 #include <iostream> 8 #include <algorithm> 9 #include <cstring> 10 #include <string> 11 #include <vector> 1

Codeforces Round #286 (Div. 1) D. Mr. Kitayuta&#39;s Colorful Graph

D - Mr. Kitayuta's Colorful Graph 思路:我是暴力搞过去没有将答案离线,感觉将答案的离线的方法很巧妙.. 对于一个不大于sqrt(n) 的块,我们n^2暴力枚举, 对于大于sqrt(n)的块,我们暴力枚举答案. 这样就能做到严格sqrt(n) * n #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #defin

codeforces 505C - Mr. Kitayuta, the Treasure Hunter(dp)

题意 一共有30000个位置,从第0个位置开始走,第一次走k步,对于每一次走步,可以走上一次的ki+1 ,ki ,ki-1步数(必须大于等于1),每个岛上有value,求最大能得到的value能有多少. 分析 一开始我想用搜索做,然后一直会T,看了题解才知道是用dp来做,感觉最后自己还是写的挺搓的_(:з」∠)_. 首先可以证明出每一步的步数与第一次的步数差值不会超过250. 开一个二维dp数组,dp[i][j]代表在第i个位置,前一步走了(j-250+k)步数 所以dp转移方程为 if(j-2

Codeforces Round #286 div.1 D 506D D. Mr. Kitayuta&#39;s Colorful Graph【并查集】

题目链接:http://codeforces.com/problemset/problem/506/D 题目大意: 给出n个顶点,m条边,每条边上有一个数字,代表某个颜色.不同数字代表不同的颜色.有很多个询问,每个询问问有多少条纯种颜色的路径使得某两个点联通. 分析: 这个题一看就想用并查集来搞,每种颜色用一个并查集处理.对于输入的每条边,我们只需要将这两个点在这条边的颜色对应的并查集中合并就好了.查询的时候,我们只需要检测这两个点在多少个颜色对应的并查集中是在统一集合中的,那么就有多少条纯种颜