zoj 3160(区间dp 简单)

来源:互联网 发布:巴基斯坦核试验数据 编辑:程序博客网 时间:2024/05/18 00:39

题目链接:点击打开链接

题目大意:一些人编号为(0~n-1),有些关系在某相邻两人中间,若有关系则就离开这个队列;求离开人数最多的是?

                    连连看的即视感,仔细分析为区间dp

#include<cstdio>#include<algorithm>#include<cstdlib>#include<cstring>int dp[305][305],queue[305],map[305][305];//MAP用于存储关系,queue用于存站队顺序using namespace std;int main(){    int m,n,i,j;    while(scanf("%d%d",&n,&m)!=EOF)    {        memset(map,0,sizeof(map));        memset(dp,0,sizeof(dp));        for( i=1;i<=m;i++)        {            int a,b;            scanf("%d%d",&a,&b);            map[a][b]=map[b][a]=1;        }        for( j=1;j<=n;j++)        scanf("%d",&queue[j]);        for(i=1;i<=n;i++)        {            if(map[queue[i]][queue[i+1]])//原始的数据处理;dp表示在队中,第i号到第j号最多可以跑走的人            dp[i][i+1]=2;        }        for(i=n-2;i>=1;i--)        {            for(j=i+2;j<=n;j++)            {                if(dp[i+1][j-1]==j-i-1&&map[queue[i]][queue[j]])//若第i和第j中间的人全抛光了,则看i个j是否有关系                dp[i][j]=j-i+1;                else                {                    for(int k=i;k<j;k++)                    {                        if(dp[i][k]+dp[k+1][j]>dp[i][j])                        dp[i][j]=dp[i][k]+dp[k+1][j];                    }                }            }        }        printf("%d\n",dp[1][n]);    }    return 0;}


0 0
原创粉丝点击