POJ 1952 BUY LOW, BUY LOWER DP 最长下降序列求个数
2013-08-29 10:37
302 查看
注意:重复的只算一次
如何去掉一些重复的是本题的关键
我的去重思路:
7
5 3 7 6
3 2 1
6
5 3 7
3 1
5
5 3 2 1 3
第一组在推到 数字 2 的时候有 3会出现重复, 显然前面一个3是可有可无的。
第二组也一样,前面一个3是可有可无的。
1.如果最长下降序列中有后面一个3, 如第一二组数据,那么前面一个3是无用的,在推好后面一个3之后把之前的所用重复的计数数组清零
2.如果最长下降序列中只有前面一个3,如第三组数据, 做情况1的操作也是不会影响结果的,因为第三组的前面一个3的状态已经推到2后才被清零的。
#include<stdio.h>
#include<string.h>
bool vis[5003];
int a[5003], dp[5003], cnt[5003];
int main()
{
int i, j, k, max, n;
while( ~scanf("%d", &n))
{
int id = 0;
for(i = 1; i <= n; i++)
scanf("%d", &a[i]);
memset(dp, 0, sizeof(dp));
memset(cnt, 0, sizeof(cnt));
int max = 0;
for(i = 1; i <= n; i++)
{
//求长度
k = 0;
for(j = 1; j < i; j++)
if(a[i] < a[j] && dp[k] < dp[j])
k = j;
dp[i] = dp[k] + 1;
if(max < dp[i]) max = dp[i];
//求个数
if(dp[i] == 1) cnt[i] = 1;
else
{
for(j = 1; j < i; j++)
if(dp[j] + 1== dp[i] && a[i] < a[j])
cnt[i] += cnt[j];
}
for(j = 1; j < i; j++)
if(a[i] == a[j])
cnt[j] = 0;
}
int ans = 0;
for(i = 1; i <= n; i++)
if(max == dp[i]) ans += cnt[i];
printf("%d %d\n", max, ans);
}
return 0;
}
如何去掉一些重复的是本题的关键
我的去重思路:
7
5 3 7 6
3 2 1
6
5 3 7
3 1
5
5 3 2 1 3
第一组在推到 数字 2 的时候有 3会出现重复, 显然前面一个3是可有可无的。
第二组也一样,前面一个3是可有可无的。
1.如果最长下降序列中有后面一个3, 如第一二组数据,那么前面一个3是无用的,在推好后面一个3之后把之前的所用重复的计数数组清零
2.如果最长下降序列中只有前面一个3,如第三组数据, 做情况1的操作也是不会影响结果的,因为第三组的前面一个3的状态已经推到2后才被清零的。
#include<stdio.h>
#include<string.h>
bool vis[5003];
int a[5003], dp[5003], cnt[5003];
int main()
{
int i, j, k, max, n;
while( ~scanf("%d", &n))
{
int id = 0;
for(i = 1; i <= n; i++)
scanf("%d", &a[i]);
memset(dp, 0, sizeof(dp));
memset(cnt, 0, sizeof(cnt));
int max = 0;
for(i = 1; i <= n; i++)
{
//求长度
k = 0;
for(j = 1; j < i; j++)
if(a[i] < a[j] && dp[k] < dp[j])
k = j;
dp[i] = dp[k] + 1;
if(max < dp[i]) max = dp[i];
//求个数
if(dp[i] == 1) cnt[i] = 1;
else
{
for(j = 1; j < i; j++)
if(dp[j] + 1== dp[i] && a[i] < a[j])
cnt[i] += cnt[j];
}
for(j = 1; j < i; j++)
if(a[i] == a[j])
cnt[j] = 0;
}
int ans = 0;
for(i = 1; i <= n; i++)
if(max == dp[i]) ans += cnt[i];
printf("%d %d\n", max, ans);
}
return 0;
}
相关文章推荐
- POJ 1952 BUY LOW, BUY LOWER DP 最长下降序列求个数
- 【最长下降子序列】北大 poj 1952 BUY LOW, BUY LOWER
- POJ - 1952 BUY LOW, BUY LOWER(最长下降子序列,计数)
- 【最长下降子序列的长度和个数】 poj 1952
- poj 1952 BUY LOW, BUY LOWER 最长下降子序列+统计不重复方案数
- poj 1952 最长不下降子序列加最长串数
- POJ 1952 BUY LOW,BUY LOWER 最长递减子序列 动态规划
- POJ 1952 BUY LOW, BUY LOWER(最长递减序列,去重, 动态规划)
- poj 1952 BUY LOW, BUY LOWER(求最长下降子序列个数)
- poj 1952 BUY LOW, BUY LOWER 最长下降子序列计数
- poj 1952 BUY LOW, BUY LOWER[最长单调子序列变形]
- POJ-1952 最长下降子序列 + 方案数
- poj 1836 Alignment( 最长上升(下降)子序列 )
- POJ 1952-最长下降子序列+去重
- POJ1952(最长下降子序列+去重)
- poj 3670 Eating Together(最长不下降子序列、LIS)
- poj 1952 最长递减子序列个数
- POJ 1836 Alignment 最长上升(下降)子序列(dp)
- poj1952 BUY LOW, BUY LOWER(最长递减子序列及个数)
- POJ 1887 Testing the CATCHER 最长不下降序列(LIS)问题