C++关于此题http://39.99.183.126:8888/p/JGYJ003的思路及代码?
注意:
枚举TLE!
AI复制粘贴别来烦人
递归版
void write(int x) {
if (x < 0) { // 判负 + 输出负号 + 变原数为正数
x = -x;
putchar('-');
}
if (x > 9) write(x / 10); // 递归,将除最后一位外的其他部分放到递归中输出
putchar(x % 10 + '0'); // 已经输出(递归)完 x 末位前的所有数字,输出末位
}
由于递归的任务量比较大,我们可以利用栈来实现非递归。
非递归版
inline void write(int x) {
static int sta[35];
int top = 0;
do {
sta[top++] = x % 10, x /= 10;//将取出的元素入栈。
} while (x);
while (top) putchar(sta[--top] + 48); //由于我们要输出字符,这里进行转换: 48 是 '0'
}
OK,这就是经典的输入输出的优化做法,通常cf榜上的大佬用的都是后面这种方法,这确实很快,比scanf和printf
快了约1/31/31/3了吧。我自己常用的就是第一种优化方法,通常我会利用宏定义来避免这么繁琐,如:#define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
那么,在主函数直接使用IOS;
语句即可实现优化功能。
根据问题的要求,题目的思路及代码如下:
思路: - 题目要求找出两个数组的最长公共上升子序列的长度。 - 首先,通过读取输入的两个数组,保存到数组a和b中。 - 然后,使用二维数组f[N][N]来保存以a[i]和b[j]结尾的最长公共上升子序列的长度。 - 遍历a数组和b数组,更新二维数组f。 - 如果a[i]和b[j]相等,则f[i][j]等于1加上前面所有比b[j]小的数的最大长度。 - 否则,f[i][j]等于前面所有比b[j]小的数加1的最大长度。 - 最后,找到f数组中的最大值,即为最长公共上升子序列的长度。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=3010;
int a[N], b[N], f[N][N];
int main()
{
int n, ans = 0;
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
for(int i = 1; i <= n; i++) scanf("%d", &b[i]);
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
f[i][j] = f[i-1][j];
if(a[i] == b[j]) {
f[i][j] = max(f[i][j], 1);
for(int k = 1; k < j; k++) {
if(b[k] < b[j]) {
f[i][j] = max(f[i][j], f[i][k] + 1);
}
}
}
}
}
for(int i = 1; i <= n; i++) {
ans = max(ans, f[n][i]);
}
printf("%d\n", ans);
return 0;
}
以上就是按位与的题目的思路及代码。
你发的这个地址需要登录啊。把题目贴出来吧