您的位置:首页 > 其它

|洛谷|动态规划|P1108 低价购买

2016-09-12 21:00 281 查看
http://www.luogu.org/problem/show?pid=1108

第一问就是最长下降子序列,第二行是下降子序列的个数(不能相同)

当前i加上前面的方案数当且仅当相同的数只加最后一个

用ok[j]表示价格为j的股票已经加过,逆推可以保证上面的条件

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define ms(i,j) memset(i, j, sizeof(i));
using namespace std;
int a[5005];
int b[5005];
int f[5005];
bool ok[50005];
int main()
{
int n;
scanf("%d", &n);
for (int i=1;i<=n;i++) scanf("%d", &a[i]);
b[1] = 1;
f[1] = 1;
for (int i=2;i<=n+1;i++)
{
int max = 0;
f[i] = 1;
for (int j=i-1;j>0;j--)
{
if (a[i]<a[j])
if (b[j]>max)
{
max = b[j];
ms(ok, true);
ok[a[j]] = false;
f[i] = f[j];
}
else
{
if (b[j]==max&&ok[a[j]])
{
ok[a[j]] = false;
f[i] += f[j];
}
}
}
b[i] = max+1;
}
printf("%d %d\n", b[n+1]-1, f[n+1]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: