题解 P5810 【[SCOI2004]文本的输入】
本文同步发布于我的 博客园。
介绍一种比较优秀的 DP 做法。
一般的思路会用
但是如果定义
考虑几种操作:
添加字符
直接从
复制、粘贴
直接遍历之前的
将这两步取最大值即可。
最后,可以证明
复杂度?
首先,可以证明答案
所以,DP 数组只需要开
同时,单步转移复杂度是
Code
DP 数组别忘记开大
#include <cstdio>
using namespace std;
const int max_n = 120;
int dp[max_n] = {};
int main()
{
int n, ans;
scanf("%d", &n);
if (n == 0)
{
puts("0");
return 0;
}
for (ans = 1; dp[ans-1] < n; ans++)
{
dp[ans] = dp[ans-1] + 1;
for (int i = ans - 7, j = 2; i > 0; i -= 2, j++)
if (dp[ans] < dp[i] * j)
dp[ans] = dp[i] * j;
}
printf("%d\n", ans-1);
return 0;
}