for(int i=0;i<k;i++)
{
dp[i]=a[i].w;
for(int j=0;j<i;j++)
{
if(a[j].n<=a[i].n) dp[i]=max(dp[i],dp[j]+a[i].w);
}
res=max(res,dp[i]);
}
超时
想利用*lower_bound(dp,dp+k,a[i])=a[i] 后再将得到的最长字串的weight加起来
很明显错误了 因为求得不是最长字串 而是最重的最长字串!!
可是!!!别人利用这个函数写出来了喏
https://blog.csdn.net/lzc504603913/article/details/78078245
秘诀在于他将weight=5 的数重复了5次,并且weight=0 的数舍弃掉!!反正都是选这个数和没选是一样的
这样子的出来的最长公共字串就是我们要求的那个!!!
当然如果权重weight很大的话就行不通了
so:
学习一下
最长上升子序列nlogn算法
其实就是自己手写lower_bound 并且比较的是weight