尼玛最近学搜索给我头搞爆掉了,上课总是可以积极回答并理解,但做作业就不太那啥了......你们懂得
5097 等差子序列
题目描述 Description
求一个序列中最长公差为d的等差子序列的长度。n<=100000
例如:
d=3
1 2 4 6 9 12 15 3
该序列的最长公差为2的子序列是6 9 12 15 长度为4
输入描述 Input Description
第一行输入一个正整数n和子序列的等差值d
第二行输入含n个正整数序列;
输出描述 Output Description
输出最长公差为d的等差子序列的长度
样例输入 Sample Input
8 3 1 2 5 6 9 12 15 3
样例输出 Sample Output
4
数据范围及提示 Data Size & Hint
n<40000
这道题我本身准备用枚举的方法做:
#include <iostream>
#include <cstdio>
using namespace std;
int a[40005], ans;
int main() {
int n, d;
cin >> n >> d;
for (int i=1; i<=n; i++) {
cin >> a[i];
}
for (int i=1; i<=n; i++) {
for (int j=i+1; j<=n; j++) {
if (a[j] - a[i] == d) {
ans ++;
}
}
}
cout << ans;
return 0;
}
可想而知0分了
会全部代码的加我Q:1708262261
不会的给思路就行了,谢谢了
王子健在2020-05-19 17:02:33追加了内容
这道题已经完美写出,问一下5098
求一个序列中最长的等比为p的等比子序列的长度。n<=100000
例如:
p=2
1 2 4 6 9 12 15 3
该序列的最长公比为d的子序列是1 2 4 长度为3
输入描述 Input Description
第一行输入一个正整数n和子序列的等比值p
第二行输入含n个正整数序列;
输出描述 Output Description
输出最长公比为p的等差子序列的长度
样例输入 Sample Input
8 2 1 2 4 6 9 12 15 3
样例输出 Sample Output
3
数据范围及提示 Data Size & Hint
n<20000
这题要用线性dp中的记忆化搜索,要用dfs的,没你想得那么简单!!!
徐子玄在2020-05-19 21:25:43追加了内容
- int dfs(int i) {
- int mx=-1;
- if(f[i]!=-1)
- return f[i];
- for(int j=1;j<i;j++)
- if(a[i]==a[j]*p)
- mx=max(mx,dfs(j));
- if(mx==-1) {
- f[i]=1;
- return 1;
- }
- else {
- f[i]=mx+1;
- return mx+1;
- }
- }
- 上面是dfs部分,主函数先输入,再把f数组置-1。最后定义 ans=-1,循环1~n,每一次ans=max(ans,dfs(i));
- AC
徐子玄在2020-05-19 21:33:12追加了内容
如果感兴趣,做一下5097等差字符串,只要把dfs中的*改成+,数组定大点就AC了!!!
徐子玄在2020-05-24 14:18:42追加了内容
这是我的作业,5097,5098两道题我都AC了,都是用线性DP+记忆化。求采纳!!!
https://wenda.codingtang.com/questions/8203/
你芬芳了。你看下黄子扬的回答