zoukankan      html  css  js  c++  java
  • 【无聊放个模板系列】HDU 3506 (四边形不等式优化DP-经典石子合并问题[环形])

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 #include<queue>
     7 #include<cmath>
     8 using namespace std;
     9 #define Maxn 1010
    10 #define INF 0xfffffff
    11 
    12 int a[2*Maxn],sum[2*Maxn];
    13 int f[2*Maxn][2*Maxn],s[2*Maxn][2*Maxn];
    14 
    15 int mymin(int x,int y) {return x<y?x:y;}
    16 
    17 int main()
    18 {
    19     int n;
    20     while(scanf("%d",&n)!=EOF)
    21     {
    22         for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    23         for(int i=1;i<=n;i++) a[i+n]=a[i];
    24         sum[0]=0;
    25         for(int i=1;i<=2*n;i++) sum[i]=sum[i-1]+a[i];
    26         memset(f,63,sizeof(f));
    27         for(int i=1;i<=2*n;i++) f[i][i]=0,s[i][i]=i;
    28         for(int i=2*n;i>=1;i--)
    29          for(int j=i+1;j<=2*n;j++)
    30          {
    31              if(j-i+1>n) break;
    32              for(int k=s[i][j-1];k<=s[i+1][j];k++)
    33              {
    34                  if(f[i][j]>f[i][k]+f[k+1][j]+sum[j]-sum[i-1])
    35                  {
    36                     f[i][j]=f[i][k]+f[k+1][j]+sum[j]-sum[i-1];
    37                     s[i][j]=k;
    38                  }
    39              }
    40          }
    41         int ans=INF;
    42         for(int i=1;i<=n;i++) ans=mymin(ans,f[i][i+n-1]);
    43         printf("%d
    ",ans);
    44     }
    45     return 0;
    46 }

    其实就是个区间DP的优化,环形石子,把它拆成链就好了【在右面copy一倍】

    四边形不等式优化DP

    2016-11-18 08:51:01

  • 相关阅读:
    KindEditor
    JS缺失错误- Uncaught SyntaxError: Unexpected token <
    JS
    SQL
    Bootstrap
    CSS-筛选 获取第一个td
    订单号创建并发问题
    保存对象时碰到的问题-列名 'Discriminator' 无效
    ViewBag对象的更改
    Kafka协议兼容性改进
  • 原文地址:https://www.cnblogs.com/Konjakmoyu/p/6076289.html
Copyright © 2011-2022 走看看