您的位置:首页 > 其它

[codevs4748]低价购买

2017-10-09 11:32 190 查看
题目←

大意:

求最长不上升子序列及方案数

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
#define INF 1061109567
using namespace std;
const int MAXN = 5000 + 50;
int f[MAXN],g[MAXN],h[MAXN],n;
int ans,sum;
map <int,bool> vis;
int main()
{
scanf("%d",&n);
for(int i = 1;i <= n;i ++)
{
scanf("%d",&h[i]);
}
h[++ n] = -INF;
for(int i = 1;i <= n;i ++)
{
f[i] = 1;
for(int j = 1;j < i;j ++)
if(h[j] > h[i])
{
f[i] = max(f[i],f[j] + 1);
}
ans = max(ans,f[i]);
}
g[1] = 1;
for(int i = 1;i <= n;i ++)
{
vis.erase(vis.begin(),vis.end());
for(int j = i - 1;j >= 1;j --)
{
if(h[j] > h[i] && f[j] == f[i] - 1)
{
//if(i == 10)printf("%d\n",j);
if(vis[h[j]])continue;
g[i] += g[j];
vis[h[j]] = true;
}
}
if(!g[i])g[i] = 1;
}
printf("%d %d",ans - 1,g
);
return 0;
}


题解在Loi_lxt 的博客里写的很清楚了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: