[关闭]
@994495jj 2017-07-28T04:49:35.000000Z 字数 1222 阅读 706

HDU6049

201707


  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define fi first
  4. #define se second
  5. #define pb push_back
  6. #define sz(a) (int)a.size()
  7. #define mp make_pair
  8. #define rep(i, a, b) for(int i=(a); i<(b); i++)
  9. #define de(a) cout<<#a<<"="<<a<<endl;
  10. typedef long long ll;
  11. typedef pair<int, int> pii;
  12. typedef vector<int> vi;
  13. //--------
  14. const int N=3005;
  15. int n;
  16. int a[N],la[N],f[N][N],mi[N][N],ma[N][N];
  17. int main() {
  18. int T;scanf("%d",&T);
  19. while(T--) {
  20. ///
  21. scanf("%d",&n);
  22. ///init
  23. memset(la,0,sizeof(la));
  24. memset(f,0,sizeof(f));
  25. ///read
  26. rep(i,1,n+1) scanf("%d",a+i);
  27. ///solve
  28. rep(i,1,n+1) {
  29. mi[i][i]=ma[i][i]=a[i];
  30. la[i]=i;
  31. f[i][i]=1;
  32. rep(j,i+1,n+1) {
  33. mi[i][j]=min(mi[i][j-1],a[j]);
  34. ma[i][j]=max(ma[i][j-1],a[j]);
  35. }
  36. }
  37. rep(len,2,n+1) {
  38. rep(i,1,n+1) {
  39. int j=len+i-1;
  40. if(j>n) break;
  41. if(ma[i][j]-mi[i][j]!=j-i) {
  42. f[i][j]=0;
  43. } else {
  44. if(mi[i][j]<mi[i][la[i]]) {
  45. f[i][j]=1;
  46. } else {
  47. f[i][j]=f[i][la[i]]+f[la[i]+1][j];
  48. }
  49. la[i]=j;
  50. }
  51. }
  52. }
  53. int ans=f[1][n];
  54. rep(l1,1,n+1) {
  55. rep(r1,l1,n+1) {
  56. if(f[l1][r1]&&(l1==1||(f[1][l1-1]&&mi[1][l1-1]==1))) {
  57. int r2=ma[l1][r1];
  58. if(r2==n||(f[r2+1][n]&&ma[r2+1][n]==n)) {
  59. for(int l2=r2;l2>r1;--l2) {
  60. if(f[l2][r2]&&mi[l2][r2]==l1) {
  61. ans=max(ans,f[1][l1-1]+f[r1+1][l2-1]+f[r2+1][n]+2);
  62. }
  63. }
  64. }
  65. }
  66. }
  67. }
  68. printf("%d\n",ans);
  69. }
  70. return 0;
  71. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注