luoguP3147 [USACO16OPEN]262144

这里有一种非常鬼畜的\(dp\)方法.

令\(dp[i][j]\)表示区间的最大值为$ i \(,区间的起始点为\) j $的区间长度.
\[
\therefore dp[i][j]=dp[i-1][j]+dp[i-1][j+dp[i-1][j]]
\]
当然前提是\(dp[i-1][j]\)和\(dp[i-1][j+dp[i-1][j]]\)能够取到.

答案是能够取到的\(dp[I][J]\)中\(I\)的最大值.

如何想到的呢?其实这是一个套路.

如果将\(dp[i][j]\)设为区间起始点为\(i\),区间长度为\(j\)的最大值,\(Then:\)

\(I'm\ happy\ to\ inform\ you\ that\ your\ test\ is\ MLE\)(艹).

但是最大值的范围只有\(\log_2262144\ +40=58\).

于是我们可以对调\(dp\)的参数,于是就得到了这个鬼畜的\(dp\).

#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define il inline
#define rg register
#define gi read<int>
using namespace std;
const int O = 1 << 18 | 10;
template<class TT>
il TT read() {
    TT o = 0,fl = 1; char ch = getchar();
    while (!isdigit(ch) && ch != '-') ch = getchar();
    if (ch == '-') fl = -1, ch = getchar();
    while (isdigit(ch)) o = o * 10 + ch - '0', ch = getchar();
    return fl * o;
}
int n, dp[58][O], ans;
int main() {
    n = gi();
    for (int i = 1; i <= n; ++i) dp[gi()][i] = 1;
    for (int i = 1; i <= 58; ++i)
        for (int j = n; j; --j)
            if (dp[i - 1][j] && dp[i - 1][j + dp[i - 1][j]]) {
                dp[i][j] = dp[i - 1][j] + dp[i - 1][j + dp[i - 1][j]];
                ans = max(ans, i);
            }
    printf("%d\n", ans);
    return 0;
}

原文地址:https://www.cnblogs.com/lylyl/p/11719521.html

时间: 2024-08-30 17:06:58

luoguP3147 [USACO16OPEN]262144的相关文章

洛谷 P3147 [USACO16OPEN]262144

P3147 [USACO16OPEN]262144 题目描述 Bessie likes downloading games to play on her cell phone, even though she doesfind the small touch screen rather cumbersome to use with her large hooves. She is particularly intrigued by the current game she is playing.

luogu P3147 [USACO16OPEN]262144

题目描述 Bessie likes downloading games to play on her cell phone, even though she doesfind the small touch screen rather cumbersome to use with her large hooves. She is particularly intrigued by the current game she is playing.The game starts with a seq

P3147 [USACO16OPEN]262144

题目描述 Bessie likes downloading games to play on her cell phone, even though she doesfind the small touch screen rather cumbersome to use with her large hooves. She is particularly intrigued by the current game she is playing.The game starts with a seq

【题解】 P3147 [USACO16OPEN]262144

区间DP,题目十分类似2048的游戏,不过从二维的平面换成了数列 数据范围中 $N <= 2*10^5$ 看来$O(N^2)$肯定是无法通过了,那么设计状态N只能添加到一维上应该是类似于$O(NlogN)$的算法 再观察题目,可以提取三个关键变量,对于某个能合并成一个数的数列中的区间,有它的左边界,右边界和合成的数三个关键变量 那么设计状态就可以设$f(i,k)$表示右边界,以$i$为左边界,$k$为合成的数易得到$f(i,k+1)=f(f(i,k)+1,k)$ 枚举$k$直到最大值就完事了,$

BZOJ 4576: [Usaco2016 Open]262144

Description 一个序列,每次可以将两个相同的数合成一个数,价值+1,求最后最大价值 \(n \leqslant 262144\) Sol DP. 这道题是 BZOJ 4580: [Usaco2016 Open]248 加强版. 做248的那个区间DP其实很多方案都是0,而且一个区间中只有一个合法的数字. 然后就是 一个区间合成一个数的方案的这个数字是固定的. \(f[i][j]\) 表示以 \(i\) 结尾是否能合成 \(j\),同时记录一下转移位置,每次向前找前一个指针就可以了. 复

bzoj4576【Usaco2016 Open】262144

4576: [Usaco2016 Open]262144 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 97  Solved: 73 [Submit][Status][Discuss] Description Bessie likes downloading games to play on her cell phone, even though she does find the small touch screen rather cumbe

bzoj4576 [Usaco2016 Open]262144

题目大意: 给出n个数a[1..n],n<=262144,a[i]<=40,相邻且相同的数可以合并成一个并将值加1,问能获得的最大数是多少 用一个双向链表维护原数列,每个节点记录此节点对应的数值和数的个数,合并相邻且对应数值相同的节点 每次选一个数值最小的点处理,此时两侧的数都更大 若这个点只有一个数则直接删去并断开两侧,此时两侧的数不可能再互相合并 若这个点有偶数个数则数值+1,个数/2,检测能否和两侧合并 若这个点有奇数个数,两侧的数也不可能再互相合并了,因此将这个点分裂成两个互不相连的点

洛谷 P3146 [USACO16OPEN]248

P3146 [USACO16OPEN]248 题目描述 Bessie likes downloading games to play on her cell phone, even though she doesfind the small touch screen rather cumbersome to use with her large hooves. She is particularly intrigued by the current game she is playing.The

洛谷P3145 [USACO16OPEN]分割田地Splitting the Field

P3145 [USACO16OPEN]分割田地Splitting the Field 题目描述 Farmer John's NN cows (3 \leq N \leq 50,0003≤N≤50,000) are all located at distinct positions in his two-dimensional field. FJ wants to enclose all of the cows with a rectangular fence whose sides are pa