ZOJ3161

朴素动态规划
ZOJ3161

题意:(严重标题党)老板不想让客人走,客人不想留,客人按顺序排好,老板抽8g(书上翻译成八卦,神翻译),抽到的
如果相邻,其中一个人由客人决定离开,求最后黑心的老板最多能让多少人留下。

输入:
n(客人个数),m(8g关系对数)
a(客人a),b(客人b)(m行)

输出:

T(最多留下的人数)


思路:之前看题目的时候看懂了,但压根想不出来怎么用dp做,因为我考虑到既然老板要求最多人,而且走人的时候又由客人来选择谁走,那么情况应该很复杂(后来证明我想多了),书上的算法分析是这样说的,整个序列可以分成一些独立的部分,每一个部分相邻的两个人都有8g,并且互不影响(当时就一直在纠结这里),然后我想了下,如果可以分成很多序列的话,要做预处理,先解出F[i]这个状态i个人这样的序列有多少,用数组存放,然后dp,dp方程其实就是判定i个人状态下,

最多有多少个人能留下来,如果我们假设枚举的是第j个人,那么相邻的就是j和j+1,所以如果走的是j,j-1和i-j代表的就是除去j后的状态,而j和i-(j+1)就是除去j+1后的状态,选取较小的和状态i比较,然后最大的就是最优的结果。最后因 为dp保存的是单个序列下能留下的最大人数,所以前面预处理的数组要用上。


#include<iostream>
#include <stdio.h>
#include <cstring>
#include <cmath>
using namespace std;
#define MAX 505
int F[MAX];
int flag[MAX];
int n,m;
int main()
{


    int index_t[MAX][MAX];
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(flag,0,sizeof(flag));
        memset(index_t,0,sizeof(index_t));
        memset(F,0,sizeof(F));
        for(int i=1; i<=m; i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            if(abs(a-b)==1)
            {
                index_t[a+1][b+1]=1;
                index_t[b+1][a+1]=1;//预处理
            }
        }
        for(int i=1; i<=n; i++)
        {
            int count=1;
            while(index_t[i][i+1])
            {
                count++;
                i++;
            }
            flag[count]++;
        }
        F[0]=0;
        F[1]=1;
        F[2]=1;
        F[3]=1;


        for(int i=4; i<=n; i++)
            for(int j=1; j<i; j++)
                F[i]=max(F[i],min(F[j]+F[i-j-1],F[j-1]+F[i-j]));


        int ans=flag[1];
        for(int i=2; i<=n; i++)
            ans+=flag[i]*F[i];
        printf("%d\n",ans);
    }
    return 0;
}


转载于:https://www.cnblogs.com/yefengCrazy/p/5636720.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值