Problem B: Doudou
Description
有只企鵝叫豆豆,總是被別的企鵝欺負。豆豆在長期的隱忍之后,掌握了所有企鵝的高度和攻擊力強度,還得到了一把黃金劍。在擁有了黃金劍以后,豆豆終于可以展開絕地大反擊。但這把黃金劍的用法卻很奇怪。
首先,豆豆第一次可以選擇任何一只企鵝開始挑戰。豆豆這一次必勝。
再次,當豆豆已經挑戰過某一只企鵝后,再下一次的挑戰對象只能是比上一名對手高,且比上一名對手攻擊力強的企鵝。這樣豆豆必勝。否則黃金劍會覺得打的沒意思而故意發脾氣輸掉。豆豆還會被大家集體暴打。
面對著這把脾氣很大的黃金劍,豆豆想請你幫助他計算一下,他最多可以連續擊敗多少只企鵝?
Input
第一行:一個數據n,代表企鵝群里除了豆豆一共有n(1 ≤ n ≤ 1000)只企鵝。
第2至第n+1行:每行2個數字。第i+1行的第一個數字為企鵝i的高度。第i+1行的第二個數字為企鵝i的攻擊力。0 ≤ 高度,攻擊力 ≤ 1,000,000。
Output
一個數。代表豆豆最多可以連續擊敗的企鵝數。
Sample Input
3
1 3
3 2
2 4
5
10 1
9 2
7 3
6 4
5 5
Sample Output
2
1
最大遞增子序列,DP,時間復雜度O(n^2)。
#include <iostream>
#include<algorithm>
using namespace std;

const int N = 1001;

struct atr
{
int h,att;

bool operator < (const atr &t) const
{
if(h<t.h && att<t.att)
return true;
return false;
}
}a[N];
int dp[N];


int main()
{
int i,j,n,ans;

while(cin>>n)
{
for(i=0;i<n;i++) cin>>a[i].h>>a[i].att;
sort(a,a+n);
memset(dp,0,n*sizeof(int));

for(ans=dp[0]=i=1;i<n;i++)
{
for(j=0;j<i;j++)
if(a[j]<a[i] && dp[j]>=dp[i])
dp[i]=dp[j]+1;
ans=(ans>dp[i])?ans:dp[i];
}
cout<<ans<<endl;
}
return 0;
}