题面:B3637 最长上升子序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
可恶,搞了半天结果是很简单的一个题目
我一直在想 目标序列 的左右对称
即序列中每一个负数块的和都小于左右两侧任一部分的和
后来看了几个题解,发现只要从一个方向扫一遍,就必定扫到最优解
将和记录下来,取最值即可
改一下思路,简单很多
源码:
// B3637 最长上升子序列
#include <bits/stdc++.h>
using namespace std;
void bb(){cout << "yes\n";}
int main(){ ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int n;
cin >> n;
// unsigned int* nums = (unsigned int*)malloc((n+1)*sizeof(unsigned int));
unsigned int dpv[n+1];//* dpv = (unsigned int*)malloc((n+1)*sizeof(unsigned int));
memset((char*)dpv,0xff,(n+1)*sizeof(unsigned int));
unsigned int tmp;
// cin >> tmp;
dpv [0] = 0;
for (unsigned int i=1;i<=n;++i){
cin >> tmp;
for (unsigned int j=0;j<i;++j){
{
if (tmp>dpv[j]){
if (tmp<dpv[j+1]){
dpv[j+1] = tmp;
}
}else break;
}
}
}
int *p = (int*) dpv;
while (*p>=0){
p++;
}
cout << (unsigned int*)p-dpv-1;
return 0;
}
标签:tmp,dpv,int,B3637,unsigned,换个,序列
From: https://www.cnblogs.com/embers-/p/17484461.html