Dynamic Programming Template

最长上升子序列 nlogn

// dp[k] 为长度为k时最小的 a[i]值;
//如果a[i] >= dp[j], 说明dp[j+1] = a[i];
//否则 二分查找dp{1-j} 中a[i] 所处的位置,并用a[i]取代。
dp[0] = -1;
int j = 0;
for(int i = 0; i < n; i++)
  if(a[i] >= dp[j]) dp[++j] = a[i];
  else {
    int idx = lower_bound(dp+1,dp+j+1,a[i]) - dp;
    dp[idx] = a[i];
  }
int ans = j;

 上一篇
下一篇 
UVA11212 Editing a Book UVA11212 Editing a Book
一、题目内容【题目描述】 你有一篇n个自然段组成的文章,希望将它们排列成1,2,…,n。可以用Ctrl+X(剪切)和Ctrl+V(粘贴)快捷键来完成任务。每次可以剪切一段连续的自然段,粘贴时按照顺序粘贴。注意,剪贴板只有一个,所以不能连续剪
2019-02-27
  目录