Luogu P4933 大师(dp)
题意
题目背景
建筑大师最近在跟着数学大师ljt12138
学数学,今天他学了等差数列,ljt12138
决定给他留一道练习题。
题目描述
ljt12138
首先建了\(n\)个特斯拉电磁塔,这些电塔排成一排,从左到右依次标号为\(1\)到\(n\),第\(i\)个电塔的高度为\(h[i]\)。
建筑大师需要从中选出一些电塔,然后这些电塔就会缩到地下去。这时候,如果留在地上的电塔的高度,从左向右构成了一个等差数列,那么这个选择方案就会被认为是美观的。
建筑大师需要求出,一共有多少种美观的选择方案,答案模\(998244353\)。
注意,如果地上只留了一个或者两个电塔,那么这种方案也是美观的。地上没有电塔的方案被认为是不美观的。
输入输出格式
输入格式:
第一行一个正整数\(n\)。
第二行\(n\)个非负整数,第\(i\)个整数是第\(i\)个电塔的高度\(h[i]\)。
输出格式:
输出一个整数,表示美观的方案数模\(998244353\)的值。
输入输出样例
输入样例#1:
8
13 14 6 20 27 34 34 41
输出样例#1:
50
输入样例#2:
100
90 1004 171 99 1835 108 81 117 141 126 135 144 81 153 193 81 962 162 1493 171 1780 864 297 180 532 1781 189 1059 198 333 1593 824 207 1877 216 270 225 1131 336 1875 362 234 81 288 1550 243 463 1755 252 406 261 270 279 288 1393 261 1263 297 135 333 872 234 881 180 198 81 225 306 180 90 315 81 81 198 252 81 297 1336 1140 1238 81 198 297 661 81 1372 469 1132 81 126 324 333 342 81 351 481 279 1770 1225 549
输出样例#2:
11153
说明
我们用\(v\)表示最高的电塔高度。
对于前\(30\%\)的数据,\(n\leq 20\)。
对于前\(60\%\)的数据,\(n\leq 100,v\leq 2000\)。
对于另外\(20\%\)的数据,所有电塔的高度构成一个等差数列。
对于\(100\%\)的数据,\(n\leq 1000,v\leq 20000\)。
思路
这而应该是个\(O(nv)\)的题,然而被我小常数\(O(n^3)\)水过了。
设计状态\(f[i][j]\)表示当前等差数列的最后两项分别为\(i,j\)的方案数,特别的,如果数字\(j\)作为等差数列的开头,记作\(f[0][j]\)。之所以这样记录,是因为我们只需要知道等差数列的最后两项就可以得到等差数列的公差,而等差数列的转移由于前面的项无关,所以这样不会丢失信息。
转移也很简单,不过要判断能否转移。
for(LL i=1;i<=n;i++) f[0][i]=1;
for(LL i=2;i<=n;i++)
for(LL j=1;j<i;j++)
{
f[j][i]=f[0][j];
for(LL k=1;k<j;k++) if(a[i]-a[j]==a[j]-a[k]) f[j][i]=(f[j][i]+f[k][j])%P;
ans=(ans+f[j][i])%P;
}
想到的一个优化方法是直接记录公差减少判断次数,不过既然水过了那就不改了(逃
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL P=998244353;
LL n,ans,a[1005],f[1005][1005];
LL read()
{
LL re=0;char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) re=(re<<3)+(re<<1)+ch-'0',ch=getchar();
return re;
}
int main()
{
ans=n=read();
for(LL i=1;i<=n;i++) a[i]=read(),f[0][i]=1;
for(LL i=2;i<=n;i++)
for(LL j=1;j<i;j++)
{
f[j][i]=f[0][j];
for(LL k=1;k<j;k++) if(a[i]-a[j]==a[j]-a[k]) f[j][i]=(f[j][i]+f[k][j])%P;
ans=(ans+f[j][i])%P;
}
printf("%lld",ans);
return 0;
}
Luogu P4933 大师(dp)的更多相关文章
- Luogu P4933 大师【dp】By cellur925
题目传送门 题目大意:给你一个序列,求子序列为等差数列的子序列个数.序列长度$n<=2000$,最高的塔高$v<=20000$. 这种计数类的题,大概就是dp的套路了⑧.开始设计的是一个错 ...
- luogu P6835 概率DP 期望
luogu P6835 概率DP 期望 洛谷 P6835 原题链接 题意 n + 1个节点,第i个节点都有指向i + 1的一条单向路,现在给他们添加m条边,每条边都从一个节点指向小于等于自己的一个节点 ...
- Luogu P1052 过河 DP
复习复习DP...都忘了QAQ... 好了这道题我其实是看题解才会的... 方程 f[i]=min(f[i-j]+v[i]) v[i]表示i是不是石头 s<=j<=t 路径压缩引用一下证明 ...
- 73: luogu 2014 树形dp
$des$ 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学分,每门课有 ...
- Luogu 4751 动态DP 模板
题面 动态求最大独立集 题解 树剖后用矩阵转移. 具体见Tweetuzki的洛谷博客 CODE #include <bits/stdc++.h> using namespace std; ...
- 洛谷 P4933 大师
题面 (实名推荐:本题的出题人小哥哥打球暴帅哦!(APIO/CTSC/WC的时候一起打过球w,而且大学在我隔壁喔) ) 没仔细看数据范围的时候真是摸不着头脑...还以为要 O(N^2) dp 爆锤.. ...
- [NOIP2016][luogu]换教室[DP]
[NOIP2016] Day1 T3 换教室 ——!x^n+y^n=z^n 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n 节课程 ...
- 【洛谷P4933 大师】动态规划
题目描述 ljt12138首先建了n个特斯拉电磁塔,这些电塔排成一排,从左到右依次标号为1到n,第i个电塔的高度为h[i]. 建筑大师需要从中选出一些电塔,然后这些电塔就会缩到地下去.这时候,如果留在 ...
- luogu4933 大师 (dp)
记f[i][j]是以i号为结尾的.公差为j的的个数(不包括只有i的情况) 那么就有$f[i][i-i']=\sum{(f[i'][i-i']+1)}$之类的东西 最后再加个n就行啦 而且公差有可能有负 ...
随机推荐
- CSIC_716_20191114【生成器、匿名函数、内置函数、三元表达式、列表生成式、生成器表达式】
生成器: 函数与yield连用,凡是函数中有yield的,调用该函数的时候均不会立即执行,而是会返回一个生成器. 生成器本质上是一个迭代器,需要通过 [生成器.__next__()]或者[nex ...
- 关于Modelsim安装闪退
在盗版Windows系统上,安装Modelsim时可能出现闪退. 现象表现为,在任务管理器中仍然有Modelsim的进程,但是看不到安装界面. 碰到这种情况可以尝试如下方法:退到安全模式下安装. 一般 ...
- 「题解」:X国的军队
问题 A: X国的军队 时间限制: 1 Sec 内存限制: 256 MB 题面 题面谢绝公开. 题解 简单贪心. 按照存活的士兵数量(即参加战斗的士兵数量减去阵亡的士兵数量)排序. 若存活士兵数量相 ...
- 期望dp+高斯消元优化——uvalive4297好题
非常好的题!期望+建矩阵是简单的,但是直接套高斯消元会T 所以消元时要按照矩阵的形态 进行优化 #include<bits/stdc++.h> using namespace std; ; ...
- js面试总结2
原型和原型链: 题目,知识点,解答: 1.如何准确地判断一个变量是数组类型 2.写一个原型链继承的例子 3.描述new一个对象的过程 4.zepto(或其他框架)源码中如何使用原型链. 知识点 构造函 ...
- web移动端rem的适配
** 需求: 随着移动端设备的变化,内容也跟着变化.**先来说说rem单位,以rem为单位,其大小是根据根元素(html标签)的字体大小来判断的, 如 html的font-size:100p ...
- [CTSC 2012]熟悉的文章
二分+单调队列优化dp+后缀自动机 //CTSC2012 熟悉的文章 #include <bits/stdc++.h> using namespace std; const int max ...
- codeforces 1100D-Dasha and Chess
传送门:QAQQAQ 题意:This is an interactive task. 999*999国际象棋棋盘中有一个王和666个车,玩家走王,电脑走车,玩家先走,玩家的目的是让对方的车将到自己的王 ...
- day 69 Django基础五之django模型层(一)单表操作
Django基础五之django模型层(一)单表操作 本节目录 一 ORM简介 二 单表操作 三 章节作业 四 xxx 一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现 ...
- android 往sd卡中写入文件
在调用前需要判断是否有写入权限 Environment类提供了比较丰富的方法 static File getDataDirectory() 获得android data的目录. static File ...