最长合法序列
2006-11-05 17:59 老博客哈 阅读(601) 评论(2) 编辑 收藏 举报/*
http://acm.hnu.cn:8080/online/?action=problem&type=show&id=10179
*/
#include <iostream>
using namespace std;
int GetMax(int B[], int len)
{
int max = B[0];
for(int i = 1; i < len; i++)
{
if(B[i] > max)
max = B[i];
}
return max;
}
int main()
{
int n;
long long A[1001];
int len;
int i, j;
cin >> n;
while(n--)
{
cin >> len;
int B[1001] = {0};
for(i = 0; i < len; i++)
cin >> A[i];
for(i = 1; i < len; i++)
{
for(j = i - 1; j >= 0; j--)
{
if(A[i] >= A[j])
{
if(B[i] <= B[j])
{
B[i] = B[j] + 1;
}
}
}
}
cout << GetMax(B, len) + 1<< endl;
}
return 0;
}
经典dp问题,记B[i]为以当前数字作为结尾的最长序列的长度,http://acm.hnu.cn:8080/online/?action=problem&type=show&id=10179
*/
#include <iostream>
using namespace std;
int GetMax(int B[], int len)
{
int max = B[0];
for(int i = 1; i < len; i++)
{
if(B[i] > max)
max = B[i];
}
return max;
}
int main()
{
int n;
long long A[1001];
int len;
int i, j;
cin >> n;
while(n--)
{
cin >> len;
int B[1001] = {0};
for(i = 0; i < len; i++)
cin >> A[i];
for(i = 1; i < len; i++)
{
for(j = i - 1; j >= 0; j--)
{
if(A[i] >= A[j])
{
if(B[i] <= B[j])
{
B[i] = B[j] + 1;
}
}
}
}
cout << GetMax(B, len) + 1<< endl;
}
return 0;
}
则 B[i] = max{B[0..i-1]} + 1 前提是A[i]的数字要比该位上的数大。