poj 1952 BUY LOW, BUY LOWER dp 但去重真是令人纠结啊!!!

来源:互联网 发布:centos twisted 编辑:程序博客网 时间:2024/06/18 00:45

这道题一开始看感觉很简单,就一个降序问题,后来这个去重真是让我煞费苦心啊!!!注意b[]数组的作用

 #include<iostream>
using namespace std;
int dp[5005];//记录降序长度
int a[5005];
int b[5005];//记录出显个数
int main()
{
 int n;
 while(cin>>n)
 {
  for(int i=0;i<5005;i++)
  {
   dp[i]=1;
   b[i]=1;
  }
  for(int i=0;i<n;i++)
  cin>>a[i];
  for(int i=1;i<n;i++)
  {
   for(int j=i-1;j>=0;j--)//注意顺序
   {
    if(a[i]<a[j])
    {
     if(dp[j]+1>dp[i])
     {
      dp[i]=dp[j]+1;
      b[i]=b[j];//当符合两个if条件的时候,注意将上一个出现次数复制下来
      
     }
     else
     if(dp[j]+1==dp[i])
     b[i]+=b[j];//当dp[j]+1==dp[i]时,意味着a[i]这个数将同一个长度又出现一次注意这时将次数加在一起
    }
    else
    if(a[i]==a[j])
    {
     if(dp[i]==1)//去重的关键,当在i到j之间如果没有dp[]使增加,意味着这个重复了,将其出现次数变为0
     b[i]=0;
     break;
    }   
   }
  }      
  int max=0;
  for(int i=0;i<n;i++)
  if(dp[i]>max)
  max=dp[i];
  int cou=0;
  for(int i=0;i<n;i++)
  if(dp[i]==max)
  cou+=b[i];
  cout<<max<<' '<<cou<<endl;
 }
 return 0;
}
 
 

原创粉丝点击