余烬

 

换个思路,简单很多——B3637 最长上升子序列

题面: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;
}

posted on 2023-06-15 23:04  _余烬  阅读(296)  评论(0)    收藏  举报

导航