zoukankan      html  css  js  c++  java
  • 合并石子,石子合并(环状区间DP)

    题见洛谷

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    #include<cstring>
    #include<cmath>
    using namespace std;
    int f1[300][300],f2[300][300];//数组二倍 f1 . f2
    int s[300];
    int w[300];
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
          scanf("%d",&w[i]),s[i]=s[i-1]+w[i];
        for(int i=n+1;i<=2*n;i++)//2*n!
          s[i]=s[i-1]+w[i-n];
        memset(f1,127/3,sizeof(f1));// /3防止爆掉int 
        for(int i=1;i<=2*n;i++)
         f1[i][i]=0,f2[i][i]=0;
        for(int p=1;p<=n-1;p++)
         for(int i=1;i<=2*n;i++)//2*n! 
         {
            int j=i+p;
            for(int k=i;k<=j-1;k++)//从i开始。 
             f1[i][j]=min(f1[i][j],f1[i][k]+f1[k+1][j]+s[j]-s[i-1]),
             f2[i][j]=max(f2[i][j],f2[i][k]+f2[k+1][j]+s[j]-s[i-1]); 
         }
         int minn=1e9,maxn=-1e9;
         for(int i=1;i<=n;i++)
         {
            if(minn>f1[i][i+n-1])
             minn=f1[i][i+n-1];
            if(maxn<f2[i][i+n-1])
             maxn=f2[i][i+n-1];
         }
         printf("%d
    %d",minn,maxn);
         return 0;
    } 

    注意:初始化!
    (数组不要开小,要用二倍的!)

  • 相关阅读:
    eclipse中的项目的JRE换成JDK
    Eclipse中maven项目的创建和运行
    git 发布命令
    vbox中虚拟ubuntu增加新的虚拟硬盘
    MyServer
    java常用的中间件
    高并发解决方案
    浅谈SpringMVC
    浅谈HIbernate
    javaweb笔记七
  • 原文地址:https://www.cnblogs.com/dfsac/p/6819796.html
Copyright © 2011-2022 走看看