| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
贴两个都AC的版本的代码,一个贪心,一个动态规划
/**
贪心版
*/
/*
#include <iostream>
#define MAX_N 5005
using namespace std;
int input[MAX_N + 1][2];
int n;
int caseNum;
bool used[MAX_N + 1];
int cmp(int pos1, int pos2)
{
if(input[pos1][0] < input[pos2][0])
return -1;
if(input[pos1][0] > input[pos2][0])
return 1;
return input[pos1][1] - input[pos2][1];
}
void swap(int pos1, int pos2)
{
int tempV1 = input[pos2][0];
int tempV2 = input[pos2][1];
input[pos2][0] = input[pos1][0];
input[pos2][1] = input[pos1][1];
input[pos1][0] = tempV1;
input[pos1][1] = tempV2;
}
void fastSort(int start, int end)
{
if(start < end)
{
int posS = start, posE = end + 1;
int curPos = start;
while(true)
{
while(cmp(curPos, ++posS) > 0 && posS < end);
while(cmp(curPos, --posE) < 0 && posE > start);
if(posS < posE)
swap(posS, posE);
else
break;
}
swap(curPos, posE);
fastSort(start, posE - 1);
fastSort(posE + 1, end);
}
}
int main()
{
int i, j;
cin>>caseNum;
while(caseNum--)
{
cin>>n;
for(i = 1; i <= n; i++)
{
cin>>input[i][0]>>input[i][1];
used[i] = false;
}
fastSort(1, n);
int total = 0;
int first;
for(i = 1; i <= n; i++)
{
if(!used[i])
{
first = i;
used[i] = true;
total++;
for(j = i + 1; j <= n; j++)
{
if(!used[j] && input[first][1] <= input[j][1])
{
used[j] = true;
first = j;
}
}
}
}
cout<<total<<endl;
}
return 0;
}
*/
/**
动态规划版本,利用动态规划求
*/
#include <iostream>
#define MAX_N 5005
using namespace std;
int input[MAX_N + 1][2];
int n;
int caseNum;
bool used[MAX_N + 1];
int curVal[MAX_N + 1];
int cmp(int pos1, int pos2)
{
if(input[pos1][0] < input[pos2][0])
return -1;
if(input[pos1][0] > input[pos2][0])
return 1;
return input[pos1][1] - input[pos2][1];
}
void swap(int pos1, int pos2)
{
int tempV1 = input[pos2][0];
int tempV2 = input[pos2][1];
input[pos2][0] = input[pos1][0];
input[pos2][1] = input[pos1][1];
input[pos1][0] = tempV1;
input[pos1][1] = tempV2;
}
void fastSort(int start, int end)
{
if(start < end)
{
int posS = start, posE = end + 1;
int curPos = start;
while(true)
{
while(cmp(curPos, ++posS) > 0 && posS < end);
while(cmp(curPos, --posE) < 0 && posE > start);
if(posS < posE)
swap(posS, posE);
else
break;
}
swap(curPos, posE);
fastSort(start, posE - 1);
fastSort(posE + 1, end);
}
}
int main()
{
int i, j;
cin>>caseNum;
while(caseNum--)
{
cin>>n;
for(i = 1; i <= n; i++)
{
cin>>input[i][0]>>input[i][1];
used[i] = false;
}
fastSort(1, n);
memset(curVal, 0, sizeof(curVal));
curVal[1] = 1;
int maxVal = -2;
for(i = 2; i <= n; i++)
{
int curMax = 1;
for(j = 1; j <= i - 1; j++)
{
if(input[i][0] < input[j][0] || input[i][1] < input[j][1])
if(curVal[j] + 1 > curMax)
curMax = curVal[j] + 1;
}
curVal[i] = curMax;
if(curMax > maxVal)
maxVal = curMax;
}
cout<<maxVal<<endl;
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator