zoukankan      html  css  js  c++  java
  • BZOJ4580: [Usaco2016 Open]248

    n<=248个数字,可以进行这样的操作:将相邻两个相同的数字合并成这个数字+1,求最大能合成多少。

    f(i,j)--区间i到j能合成的最大值,f(i,j)=max(f(i,k)+1),f(i,k)=f(k+1,j)。

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<algorithm>
     4 #include<stdlib.h>
     5 #include<math.h>
     6 //#include<iostream>
     7 using namespace std;
     8  
     9 int n;
    10 #define maxn 311
    11 int f[maxn][maxn];
    12 int main()
    13 {
    14     scanf("%d",&n);
    15     int ans=0;
    16     for (int i=1;i<=n;i++) scanf("%d",&f[i][i]),ans=max(ans,f[i][i]);
    17     for (int len=1;len<n;len++)
    18         for (int i=1,j=i+len;j<=n;i++,j++)
    19         {
    20             f[i][j]=-1;
    21             for (int k=i;k<j;k++)
    22                 if (f[i][k]==f[k+1][j]) f[i][j]=max(f[i][j],f[i][k]+1);
    23             ans=max(ans,f[i][j]);
    24         }
    25     printf("%d
    ",ans);
    26     return 0;
    27 }
    View Code
  • 相关阅读:
    1372
    SPOJ
    HDU 3966-Aragorn's Story 树链剖分+树状数组
    LightOJ 1348
    HihoCoder 1568 不一定合法括号序列
    LightOJ 1343
    LightOJ 1266
    LightOJ 1112
    HihoCoder 1328 BFS 搜索
    链表交集、合并、排序
  • 原文地址:https://www.cnblogs.com/Blue233333/p/7620109.html
Copyright © 2011-2022 走看看