uva 10558 - A Brief Gerrymander

dp入门完美的收场

tle无数次,wa了无数次后ac,得到4th rank,好激动!!!

tle原因:

开了三维的dp数组,本以为不会tle的,可能是数据很强吧

wa:

这组数据

3
5 5
6 16
9 10
3
1 15 100
4

输出:

4 1 6 11 100

如果输出是4 1 2 6 100表明坐标搞反了。

 

解法:

dp[i][k]表示在区间[i,100)内有k条分隔线时的最多的分区

s[i][j]表示[i,j)区间内的分隔线的个数为0时分区的个数。

其他细节略去

#include <iostream>
#include<cstdio>
#include<cstring>
#define N 105
using namespace std;

bool G[N][N];
int dp[N][N],n,m,num[N],A,f[N][N],v[N][N],s[N][N];
void init()
{
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<=100;j++)
        {
            f[i][j]=0;
            for(int k=num[i];k<num[i+1];k++)
            if(G[k][j])
            f[i][j]++;

            v[i][j]=f[i][j];
            if(j!=0)
            f[i][j]+=f[i][j-1];
        }
    }
    for(int i=1;i<=100;i++)
    for(int j=i+1;j<=100;j++)
    {
        s[i][j]=0;
        for(int k=1;k<m;k++)
        {
            int t=f[k][j-1]-f[k][i]+v[k][i];
            if(t)
            s[i][j]++;
        }
    }
}
int DP(int i,int k)
{
    if(dp[i][k]!=-1)
    return dp[i][k];
    if(k==0)
    return dp[i][k]=s[i][100];

    for(int m=i+1;m<=100;m++)
    {
        if(100-m-1<k-1)
        break;
        dp[i][k]=max(dp[i][k],s[i][m]+DP(m,k-1));
    }
    return dp[i][k];
}
void print(int i,int k)
{
    if(k==0)
    return ;
    for(int m=i+1;m<=100;m++)
    {
        if(100-m-1<k-1)
        break;
        if(dp[i][k]==s[i][m]+dp[m][k-1])
        {
            printf(" %d",m);
            print(m,k-1);
            break;
        }
    }
}
int main()
{
    num[0]=1;
    while(scanf("%d",&n),n!=-1)
    {
        memset(G,false,sizeof(G));
        memset(dp,-1,sizeof(dp));

        for(int i=0;i<n;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            G[x][y]=true;
        }
        scanf("%d",&m);
        for(int i=1;i<=m;i++)
        scanf("%d",&num[i]);
        scanf("%d",&A);
        num[m+1]=100;
        init();
        DP(1,A-2);
        printf("%d",A);

        printf(" 1");
        print(1,A-2);
        puts(" 100");
    }
    return 0;
}

  

你可能感兴趣的:(uva)