http://www.lydsy.com/JudgeOnline/problem.php?id=2448

 

一遍过,嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎,O(∩_∩)O~

 

题意是最小化最大值

 

设计区间dp

dp[i][j] 表示在能确定x不在区间[i,j]内,或确定x在区间[i,j]内某个位置的最坏情况下的最小值

dp[i][j]=min { max(dp[i][k-1],dp[k+1][j] ) + a[k] }  k∈[i,j]

O(n^3)复杂度

#include<cstdio>
#include<cstring>
#include<iostream>
 
using namespace std;
 
#define N 2002
 
int a[N];
 
int dp[N][N];
 
void read(int &x)
{
    x=0; char c=getchar();
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); }
}
 
int main()
{
    int n;
    read(n);
    for(int i=1;i<=n;++i) read(a[i]);
    memset(dp,63,sizeof(dp));
    for(int i=1;i<=n;++i)
        dp[i][i]=a[i],dp[i][i-1]=0;
    for(int i=n;i;--i)
        for(int j=i;j<=n;++j)
            for(int k=i;k<=j;++k)
                dp[i][j]=min(dp[i][j],max(dp[i][k-1],dp[k+1][j])+a[k]);
    printf("%d",dp[1][n]); 
} 
View Code

相关文章: