题解 P3147 【[USACO16OPEN]262144】
3493441984zz · · 题解
动态规划
其实这题很简单,但是我就是看了题解。。。
这篇题解的思路和其他
状态
我们定义
那么状态转移方程如下:
为什么呢?
其实这就有点倍增的味道了,我们首先(没有图,自行脑补或者参考其他人的题解
我们先在脑海中画一个数轴
然后最左边的一个点位置为
那么我们可以求出
那么我们接下来呢?
我们从这个位置继续向后,看看到哪个位置又能合并出一个
所以,状态转移就是
接下来是美滋滋的代码时间~~~
#include<iostream>
#include<cstdio>
#define N 61
#define M 270007
using namespace std;
int n,ans;
int f[N][M];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
int in;
scanf("%d",&in);
f[in][i]=i+1;
}
for(int i=2;i<=58;++i)//58?????
for(int j=1;j<=n;++j)
{
if(!f[i][j])
f[i][j]=f[i-1][f[i-1][j]];
if(f[i][j])
ans=i;
}
printf("%d",ans);
}
那么上面这个神奇的58 呢?
其实就跟数据范围有关
我们看到
而数字的大小在