题解:B4280 [蓝桥杯青少年组国赛 2023] 数学实验
Yi_chen123 · · 题解
思路
区间 DP 好题。
先把三要素给理出来吧。
状态
我们令
边界
我们假设
转移
略有些烧脑了哦。
我们使用倍增思想,考虑
根据题意我们可以得知,要想合成出
所以,我们从
故动态转移方程如下:
(注:此处的 \large 字号,是由于出现了嵌套的下角标,为了使公式更加清晰故使用。)
代码
#include<bits/stdc++.h>
using namespace std;
int ar[510005];
int dp[510005][100];
int main(){
int n; cin >> n;
for(int i = 1; i <= n; ++i){
cin >> ar[i];
dp[i][ar[i]] = i + 1;
}
int ans = 0;
for(int j = 2; j <= 98; ++j){
for(int i = 1; i <= n; ++i){
if(!dp[i][j]) dp[i][j] = dp[dp[i][j - 1]][j - 1];
if(dp[i][j]) ans = j; //如果可以合成,才记录到答案中
}
}
cout << ans << endl;
return 0;
}
对了,给大家注明一下此处的
三倍经验:
- P3146 [USACO16OPEN] 248 G
- P3147 [USACO16OPEN] 262144 P