poj 1952 BUY LOW, BUY LOWER

来源:互联网 发布:access sql update 编辑:程序博客网 时间:2024/05/15 06:08
dp:求一串序列中最长递减子序列包含的数的个数以及有几个长度相同的最长的递减子序列,并不要求连续。#include <iostream>#include <string.h>#include <cstdio>using namespace std;const int size = 5100;int maxlen[size];int maxnum[size];int main(){    int a[size];    int n;    while (scanf("%d", &n) != EOF){          for (int i = 1; i <= n; i ++){              scanf("%d", &a[i]);              maxnum[i] = 0;              maxlen[i] = 1;          }          for (int i = 1 ; i <= n; i ++){              for (int j = 1; j < i; j ++){                  if (a[i] < a[j]){                     maxlen[i] = max(maxlen[i], maxlen[j]+1);//我们只要比较每一个a[i]和它前面的a[j](j<i),如果a[i]>a[j],则到i为止的的最长序列至少比到j多1.                  }              }          }          for (int i = 1; i <= n; i ++)              if (maxlen[i] == 1)maxnum[i] = 1;          for (int i = 1; i <= n; i ++){              for (int j = i-1; j > 0; j --){                  if (a[j] > a[i]){                     if (maxlen[j]+1 == maxlen[i]){                        maxnum[i] += maxnum[j];                     }                  }                  if (a[j] == a[i]){                     if (maxlen[i] == 1)maxnum[i] = 0;                     break;                  }              }          }          int maxx = -1;          for (int i = 1; i <= n; i ++){              if (maxlen[i] > maxx)  maxx = maxlen[i];          }          int ans = 0;          for (int i = 1; i <= n; i ++){              if (maxlen[i] == maxx) ans += maxnum[i] ;          }          printf("%d %d\n", maxx, ans);    }    return 0;}

原创粉丝点击