zoukankan      html  css  js  c++  java
  • bzoj 1563

    对于很多决策单调性DP问题,我们很难(但不是不可以)证明其决策满足单调性,所以感觉很像时,可以打表看是否满足。

    这道题的精度(?范围)很难搞,开始生怕溢出,看了hzwer的代码,才发现用long double,因为这道题只有乘法,没有除法,并且long double的保存系数的那部分还是挺大的(好像有效位数是64位)。

     1 #include <cstdio>
     2 #include <cstdlib>
     3 #include <cstring>
     4 #define min(a,b) ((a)<(b)?(a):(b))
     5 #define max(a,b) ((a)>(b)?(a):(b))
     6 #define abs(a) ((a)<0?-(a):(a))
     7 #define mdp 1000000000000000000LL
     8 #define N 100010
     9 
    10 typedef long double ddt;
    11 
    12 struct Trid {
    13     int p, l, r;
    14     Trid(){}
    15     Trid( int p, int l, int r ):p(p),l(l),r(r){}
    16 };
    17 
    18 int n, len, pw;
    19 int w[N], sw[N], f[N]; 
    20 ddt dp[N];
    21 Trid stk[N]; int top;
    22 
    23 ddt pow( int a, int b ) {
    24     ddt rt = 1;
    25     for( int i=1; i<=b; i++ ) 
    26         rt *= a;
    27     return rt;
    28 }
    29 ddt getw( int j, int i ) {
    30     return pow(abs(sw[i]-sw[j-1]+i-j-len), pw);
    31 }
    32 ddt calc( int j, int i ) {
    33     ddt rt = dp[j-1]+getw(j,i);
    34     if( rt<0 ) {
    35         fprintf( stderr, "Overflow
    " );
    36         exit(0);
    37     }
    38     return rt;
    39 }
    40 ddt dodp() {
    41     stk[top=1] = Trid( 1, 1, n );
    42     dp[1] = calc(1,1);
    43     for( int i=2; i<=n; i++ ) {
    44         if( calc(stk[top].p,n)>calc(i,n) ) {
    45             while( stk[top].l>=i && calc(stk[top].p,stk[top].l)>calc(i,stk[top].l) )
    46                 top--;
    47             if( stk[top].r==i-1 ) {
    48                 stk[++top] = Trid( i, i, n );
    49             } else {
    50                 int lf=max(stk[top].l+1,i);
    51                 int rg=min(stk[top].r+1,n);
    52                 while(lf<rg) {
    53                     int mid=(lf+rg)>>1;
    54                     if( calc(stk[top].p,mid)>calc(i,mid) )
    55                         rg = mid;
    56                     else
    57                         lf = mid+1;
    58                 }
    59                 stk[top].r = lf-1;
    60                 stk[++top] = Trid( i, lf, n );
    61             }
    62         }
    63         int lf=1, rg=top;
    64         while(lf<rg) {
    65             int mid=(lf+rg+1)>>1;
    66             if( stk[mid].l>i ) rg=mid-1;
    67             else lf=mid;
    68         }
    69         dp[i] = calc(stk[lf].p,i);
    70     }
    71     return dp[n];
    72 }
    73 int main() {
    74     int T;
    75     scanf( "%d", &T );
    76     while( T-- ) {
    77         scanf( "%d%d%d", &n, &len, &pw );
    78         for( int i=1; i<=n; i++ ) {
    79             char buf[100];
    80             scanf( "%s", buf );
    81             w[i] = strlen(buf);
    82             sw[i] = sw[i-1]+w[i];
    83         }
    84         ddt ans=dodp();
    85         if( ans>mdp ) 
    86             printf( "Too hard to arrange
    " );
    87         else
    88             printf( "%lld
    ", (long long)ans );
    89         printf( "--------------------
    " );
    90     }
    91 }
    View Code
  • 相关阅读:
    spring+hibernate 整合异常 Class 'org.apache.commons.dbcp.BasicDataSource' not found
    ExtJS+SpringMVC文件上传与下载
    没有权限角色管理功能菜单加载
    java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Java he
    js 验证input 输入框
    目录结构
    文件权限命令 linux
    Java 代码完成删除文件、文件夹操作
    js 获取时间不能大于当前系统时间
    hibernate createQuery和createSQLQuery 查询结果count计算
  • 原文地址:https://www.cnblogs.com/idy002/p/4403503.html
Copyright © 2011-2022 走看看