競プロ今日の備忘録

問題を解いた上での気づき、反省を

JOI春合宿2007: Building

http://www.ioi-jp.org/camp/2007/2007-sp-tasks/2007-sp-day2_21.pdf

DPの練習。最長増加部分列問題そのまま。 O(n2)解法で解いた。後でO(nlogn)解法も理解しておきたい。

#include <cstdio>
#include <algorithm>

using namespace std;

int n,b[1000],dp[1000];

int main(){
  scanf("%d",&n);
  for(int i=0;i<n;i++){
    scanf("%d",&b[i]);
  }
  int ans=0;

  for(int i=0;i<n;i++){
    dp[i]=1;
    for(int j=0;j<i;j++){
      if(b[i]>b[j]){
        dp[i]=max(dp[i],dp[j]+1);
      }
    }
    ans=max(ans,dp[i]);
  }

  printf("%d\n",ans);

  return 0;
}