// 此博文为迁移而来,写于2015年6月6日,不代表本人现在的观点与看法。原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w3ai.html

1、前言
       我也是实在不能忍我的动态规划水平了,所以要好好搞了。那么在狠狠补了许久的初级数据结构以及学了一些新的高级数据结构之后,现在开始把重点放在DP上。
 
2、题目

分析:考虑两种方法。第一种为利用前缀和优化转移,f[i][j]表示从1到 i 选择 j 个元素,即f[i][j]=max(f[k][j−1]+a[i]) (k<i-1)f[i][j]表示从1到 i 选择 j 个元素,且最后一个元素必须选;g[i][j]表示从1到i-1选 j 个元素,即相比f[i][j]少了一个第 i 位。g[i][j]只是起一个辅助作用,意在选第 i 个和不选两种情况下选择最大值。

代码:
----------------------------------------------------------------------------------------------------
#include<cstdio>
#define MAXN 1005
#define INF 1<<30
 
typedef long long ll;
 
ll max(ll a,ll b) { return (a>b)?a:b; }
 
ll n,k,f[MAXN][MAXN],g[MAXN][MAXN],a[MAXN];
 
int main()
{
        freopen("a.in","r",stdin);
        freopen("a.out","w",stdout);
        scanf("%I64d %I64d",&n,&k);
        for (int i=1;i<=k;i++) f[0][i]=g[0][i]=-INF;
        for (int i=1;i<=n;i++) scanf("%I64d",&a[i]);
        for (int i=1;i<=n;i++)
                for (int j=1;j<=k;j++)
                {
                        f[i][j]=g[i-1][j-1]+a[i];
                        g[i][j]=max(f[i-1][j],g[i-1][j]);
                }
        printf("%I64d",max(g[n][k],f[n][k]));

----------------------------------------------------------------------------------------------------
注意:需要开long long。
 

分析:灵感来源于最长公共子序列问题,用f[i][j]表示数组a的前i位和数组b的前j位能够连线的条数。根据题意不难发现,线只存在两种情况——一条线单独存在;两条线交叉。即:
           1、a[i]=b[j] 时,f[i][j]=f[i-1][j-1]+1
           2、a[i]≠b[j]时,又存在三种情况:f[i][j]=max(f[x][y]+2,f[i-1][j],f[i][j-1])。上述的x,y分别表示b[j]的数值在数组a的位置,a[i]的数值在数组b的位置。
           x,y 预处理于两个数组中。需注意,必须满足x小于i,y小于j,因为后面的状态你还没算到呢(我想了好久为什么 = =。。)
 
代码:
-----------------------------------------------------------------------------------------------------
#include<cstdio>
#define MAXN 1005
int max(int a,int b) { return (a>b)?a:b; }
int temp[MAXN],link[MAXN],f[MAXN][MAXN],numa[MAXN],numb[MAXN],n,a[MAXN],b[MAXN];
int main()
{
         freopen("b.in","r",stdin);
         freopen("b.out","w",stdout);
         scanf("%d",&n);
         for (int i=1;i<=n;i++) { scanf("%d",&a[i]); numa[a[i]]=i; }
         for (int i=1;i<=n;i++) { scanf("%d",&b[i]); numb[b[i]]=i; }
         for (int i=1;i<=n;i++)
         for (int j=1;j<=n;j++)
         {
                 if (a[i]==b[j]) f[i][j]=f[i-1][j-1]+1;
                 else 
                 {
                         f[i][j]=max(f[i][j-1],f[i-1][j]);
                         if (numa[b[j]]<i && numb[a[i]]<j) f[i][j]=max(max(f[numa[b[j]]][numb[a[i]]]+2,f[i-1][j]),f[i][j-1]);
                 }
        }
       printf("%d",f[n][n]);
       return 0;
}

----------------------------------------------------------------------------------------------------
 
c题跳过。
 
分析:这样题看起来比较麻烦,其实如果巧妙地利用好相对论,写出来的状态转移方程比a题还简单。。。然而这种题最难想出来了。我们假设数组最大值n,放在数组a[i]上。则若n-1在n的前面,则n-1必须为第一位,否则则可以放在任意位置。不然的话,最长上升子序列必定存在长度大于2的情况。根据这条规律,我们可以向前递归——若n-1在n的前面,我们考虑n-2和n的位置关系。若n-2又在n的前面,则n-2只能为第二位,若n-2在n的后面,则任意位置都行;若n-1在n的后面,我们考虑n-2和n-1的位置关系。。等等,有点扯不清了,等下再补充。
 
P.S. 本页两个bug:这套试题是2015年5月28日考的;第二题输入格式和数据范围都有点小问题但并不重要。

转载于:https://www.cnblogs.com/jinkun113/p/4682869.html

[考试]20150528相关推荐

  1. 20150528 UI考试项目中,使用SHAI加密,生成请求URL

    <span style="font-size:18px;">#pragma -mark 利用SHAI加密,求得网络请求URL地址 - (void)getURLOfCat ...

  2. 中国矿业大学计算机学院机房,2020年中国矿业大学计算机学院初试自命题科目考试大纲-数据结构...

    一. 考试目的与要求 目的:通过本科目的考试,考察计算机专业人员对<数据结构>课程内容的理解和掌握程度以及相关算法编写能力. 要求:掌握各种基本概念和术语,掌握算法描述和分析的方法.重点是 ...

  3. 中文版证书_CIA考试多久后才可以领取证书?领取的方式是什么?

    CIA考试通过后,过久可以拿到证书?怎么才能拿到证书呢?除了通过科目考试还有其他什么条件呢?通过科目考试的学生还要做些什么?我们一起来看看吧. (一)CIA考试通过后,多久才可以领取证书? 1.考试结 ...

  4. 2021年高考模拟考成绩查询,2021年湖北省普通高考模拟考试成绩查询

    高考对人生的重要性众所周知,其中正式高考前的模拟考试也让学生和学生家长关注,而2021年的湖北省普通高考模拟考试也出炉了,考生可登入湖北省教育考试院查询成绩,模拟考后要分析题,总结题,下面来看详细信息 ...

  5. 计算机二级函数知识,2017年全国计算机二级考试MS Office高级应用知识点:INDIRECT函数...

    INDIRECT函数知识点 适用考试:全国计算机二级考试 考试科目:MS Office高级应用 科目知识点:INDIRECT函数 INDIRECT函数立即对引用进行计算,并显示其内容.当需要更改公式中 ...

  6. 职称考试还要考计算机 英语,强烈建议取消所谓的英语职称和计算机考试

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 强烈要求取消职称计算机`英语考试 职称计算机`英语考试坑苦了广大相关受害者,其实质是某个别部门单位敛财的冠冕堂皇的项目.那些政策制定者美其名曰是通过考试激 ...

  7. 广东省卫生2021副高考试成绩查询,中国卫生人才网:广东2021卫生资格考试成绩查询入口 -中国卫生人...

    国家卫生资格考试网为您发布 中国卫生人才网:广东2021卫生资格考试成绩查询入口 ,同步中国卫生人才网信息:2021广东卫生资格成绩查询.更多关于卫生资格成绩,2021卫生资格考试,卫生资格考试,国家 ...

  8. 安徽全国计算机缴费,全国计算机等级考试3月报名 安徽首次网上报名缴费

    2月10日从招生考试院获悉,2017年3月份全国计算机等级考试(以下简称NCRE)报名工作即将开始,今年也是我省首次在全省范围内实行网上报名及缴费. 据介绍,本次考试时间为3月25日至28日(第48次 ...

  9. 乐高机器人教室布置图片大全_全国青少年机器人技术等级考试(上海宝山站)顺利举行...

    "全国青少年机器人技术等级考试(上海宝山站)"于2020年9月26日在贝乐机器人宝山水产路校区顺利举行,是贝乐机器人受中国专业人才库全国机器人管理中心委托,为了培养青少年儿童科学素 ...

最新文章

  1. LeetCode Counting Bits(动态规划)
  2. java中Thread与Runnable的区别
  3. vim使用四个空格代替TAB键
  4. android double比较大小吗,Android双向选择控件DoubleSeekBar使用详解
  5. 两层卷积网络实现手写数字的识别(基于tensorflow)
  6. 作者:黎建辉(1973-),男,博士,中国科学院计算机网络信息中心研究员、博士生导师...
  7. JeeWx捷微3.0多触点版本发布,支持微信公众号,微信企业号,支付窗——喜迎双“旦”
  8. 判别性的低秩字典学习代码matlab,基于分类的判别性字典学习的稀疏编码算法研究...
  9. Java语言程序设计 基础篇 原书第10版梁勇著 课后编程练习题答案1
  10. Dll注入技术之驱动注入
  11. “一线城市,年薪30万+,我却裸辞回老家”一个寒门贵子的10年职业思考
  12. mate7tl10是Android,华为Mate 7 MT7-TL10官方线刷包安卓5.1.1Rom刷机包
  13. HTML5期末大作业——布卡漫画官网(4个页面)HTML+CSS+JavaScript
  14. 二级c语言培训资料,全国计算机二级考试C语言,培训资料.doc
  15. 3月18日作业-监理师培训
  16. linux串口蜂鸣器报警电路,蜂鸣器报警器电路图大全(五款模拟电路设计原理图详解)...
  17. 55ide游戏引擎教程2:新建项目Hello World
  18. DTX1800校准的意义?---DTX-1800线缆测试仪此校准而非彼校准
  19. 二、何为Spring Boot整合Spring Cloud?
  20. Matplotlib绘制圆环图

热门文章

  1. 图像处理--图像上采样和下采样
  2. 编写AXI4协议读写BRAM并仿真验证
  3. matlab读取txt数据绘图(python命令行传参)
  4. 数字语音信号处理学习笔记——语音信号的短时时域分析(1)
  5. void与void*详解
  6. win32程序启用控制台-- 调试输出
  7. python print用法制表空格_python中print函数的输出问题(空格,制表符)
  8. Debug Docker: Error response from daemon: dial unix docker.raw.sock: connect: connection refused
  9. python3精要(31)-生成器函数yield
  10. c++17(17)-异常try catch,operator[],vector at