| ||||||||||
| 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 | |||||||||
WA的人来看看这组简单数据6
4 3 4 1 3 1
======
答案应该是3 1,最长长度为3,只有一种情况:4,3,1,我也是计数计了好久都没找到正确的方法计正确。网上找到了一个很简洁的方法,下面是我AC的代码,我是从右到左算最大升序列
#include <iostream>
#include <fstream>
using namespace std;
const int N = 5001;
int n, dp_len[N], a[N], ans_len, dp_time[N],ans_time;
int main()
{
fstream fin("1952.txt");
fin>>n;
for(int i = 1; i <= n; i++)
fin>>a[i];
ans_len = 1; dp_len[n] = 1; dp_time[n] = 1;
for(int i = n-1; i >= 1; i--)
{
dp_len[i] = 1; dp_time[i] = 1;
for(int j = i+1; j <= n; j++)
if(a[i] > a[j])
{
if(dp_len[j] + 1 > dp_len[i])
{
dp_len[i] = dp_len[j]+1; dp_time[i] = dp_time[j];
}
else if(dp_len[j]+1 == dp_len[i])
dp_time[i] += dp_time[j];
}
else if(a[i] == a[j])//key point!
{
if(dp_len[i] == 1)
dp_time[i] = 0;
break;
}
///////////////////////////
if(dp_len[i] > ans_len)
ans_len = dp_len[i];
}
///////////////////////////
ans_time = 0;
for(int i = 1; i <= n; i++)
if(dp_len[i] == ans_len)
ans_time += dp_time[i];
cout<<ans_len<<" "<<ans_time<<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