zoukankan      html  css  js  c++  java
  • 洛谷 p1880 石子合并 区间dp

    这里写链接内容
    错误程序

    #include<cstdio>
    #include<iostream>
    using namespace std;
    int n;
    int a[9999];
    int s[9999],f1[999][999]; 
    int f2[999][999];
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            a[n+i]=a[i];
            s[i]=s[i-1]+a[i];
            s[i+n]=s[i+n-1]+a[i];
        }
    //  for(int i=1;i<=n;i++)   
    
        for(int i=1;i<=2*n;i++)
         for(int j=1;j<=2*n;j++) 
        {
            f1[i][j]=99999999;
            f2[i][j]=-99999999;
        }
        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-p;i++)
        {
            int j=i+p;
            for(int k=i;k<=j-1;k++)
            {
                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 min1=99999999,max1=-99999999;
        for(int i=1;i<=n;i++)
         min1=min(f1[i][n+i-1],min1);
        for(int i=1;i<=n;i++)
         max1=max(f2[i][n+i-1],max1);
        printf("%d
    %d",min1,max1);
        return 0;
    }

    这个程序前缀和处理错了,在一开始还没处理好s[i]在s[n+i]里就调用了,以至于最小值求错了。
    ac程序

    #include<cstdio>
    #include<iostream>
    using namespace std;
    int n;
    int a[9999];
    int s[9999],f1[999][999]; 
    int f2[999][999];
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            a[n+i]=a[i];
            s[i]=s[i-1]+a[i];
    
        }
        for(int i=1;i<=n;i++)    
        s[i+n]=s[i+n-1]+a[i];
        for(int i=1;i<=2*n;i++)
         for(int j=1;j<=2*n;j++) 
        {
            f1[i][j]=99999999;
            f2[i][j]=-99999999;
        }
        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-p;i++)
        {
            int j=i+p;
            for(int k=i;k<=j-1;k++)
            {
                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 min1=99999999,max1=-99999999;
        for(int i=1;i<=n;i++)
         min1=min(f1[i][n+i-1],min1);
        for(int i=1;i<=n;i++)
         max1=max(f2[i][n+i-1],max1);
        printf("%d
    %d",min1,max1);
        return 0;
    }

    只需要把前缀和弄到后面就ac了。。。

  • 相关阅读:
    Eclipse安装Hadoop插件
    (转)Ubuntu14.0.4中hadoop2.4.0伪分布模式配置
    Hadoop--DataNode无法启动
    启动与关闭hadoop
    hadoop中执行命令时发生错误
    strings命令
    Deriving data from ElasticSearch Engine
    elasticsearch data importing
    reading words in your computer and changing to female voice, linux festival text2wave saving wav files
    DDNS client on a Linux machine
  • 原文地址:https://www.cnblogs.com/wspl98765/p/6819906.html
Copyright © 2011-2022 走看看