当前位置: 首页 > news >正文

动态规划 List

例题


    #A 传纸条(Accepted)
    #B 乘积最大 (Unaccepted)
    #C 石子合并 (Accepted)
    #D 加分二叉树 (Unaccepted)
    #E 没有上司的舞会(Unaccepted)
    #F 选课 (Accepted)
    #G 警卫安排 (Unaccepted)
    #H 通向自由的钥匙 (Unaccepted)

    #I 导弹拦截 (Unaccepted)
    #J [HAOI2010]最长公共子序列 (Unaccepted)
    #K 排列LCS问题 (Unaccepted)
    #L 尼克的任务(Accepted)
    #M 多米诺骨牌(Accepted)
    #N 最大子树和(Unaccepted)
    #O “访问”美术馆(Unaccepted)
    #P 石子合并(Accepted)
    #Q 关路灯(Unaccepted)
    #R M国王(Unaccepted)
    #S 愤怒的小鸟(Unaccepted)

 


 

1. LCS 最长公共子序列

/* LCS
 * Au: GG
 */
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1005;
int n, m, d[N][N], A[N], B[N];

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) scanf("%d", &A[i]);
    for (int i = 1; i <= m; i++) scanf("%d", &B[i]);

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            d[i][j] = max(d[i - 1][j], d[i][j - 1]);
            if (A[i] == B[j])
                d[i][j] = max(d[i][j], d[i - 1][j - 1] + 1);
        }
    }

    printf("%d\n", d[n][m]);
    return 0;
}

 2. LIS 最长上升自序列

/**
 * LIS
 * Au: GG
 **/

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 1000000 + 3;
int n, a[N], d[N];
int ans;

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
    }
    
    for (int i = 1; i <= n; i++) {
        d[i] = 1;
        for (int j = 1; j < i; j++) {
            if (a[i] > a[j] && d[j] + 1 > d[i])
                d[i] = d[j] + 1;
        }
        ans = max(ans, d[i]);
    }
    
    printf("%d\n", ans);
    return 0;
}

 3. 01 背包

// 01 Knapsack
// Au: GG

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;

int n, v, w[33], f[33][20003];

int main() {
    scanf("%d%d", &v, &n);
    for (int i = 1; i <= n; i++) scanf("%d", &w[i]);

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= v; j++) {
            if (j - w[i] < 0) f[i][j] = f[i - 1][j];
            else f[i][j] = max(f[i - 1][j - w[i]] + w[i], f[i - 1][j]);
        }
    }

    printf("%d", v - f[n][v]);

    return 0;
}

 4. 完全背包

/**
 * Luogu P1616 疯狂的采药
 * Au: GG
 **/

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n, m, d[100000+4], w[100000+3], v[100000+3];

int main() {
    scanf("%d%d", &m, &n);
    for (int i = 1; i <= n; i++) scanf("%d%d", &v[i], &w[i]);
    
    for (int i = 1; i <= n; i++) {
        for (int j = v[i]; j <= m; j++) {
            d[j] = max(d[j], d[j - v[i]] + w[i]);
        }
    }
    
    printf("%d\n", d[m]);
    return 0;
}

 5. 多维背包

/**
 * Luogu P1855 榨取kkksc03
 * Au: GG
 **/

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 100 + 3, M = 200 + 3;
int n, m, t, time[N], w[N], d[N][M][M];

int main() {
    scanf("%d%d%d", &n, &m, &t);
    for (int i = 1; i <= n; i++) scanf("%d%d", &time[i], &w[i]);
    
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j <= m; j++) {
            for (int k = 0; k <= t; k++) {
                d[i][j][k] = d[i - 1][j][k];
                if (j - time[i] >= 0 && k - w[i] >= 0 && d[i - 1][j - time[i]][k - w[i]] + 1 > d[i][j][k])
                    d[i][j][k] = d[i - 1][j - time[i]][k - w[i]] + 1;
            }
        }
    }
    
    printf("%d\n", d[n][m][t]);    
    return 0;
}

6. 树形 DP (Unaccepted)

 

7. 区间 DP

/* Luogu P1880 石子合并
 * Au: GG
 */
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100 + 5;
const int inf = 2147483647;
int n, d[2 * N][2 * N], e[2 * N][2 * N], a[N], sum[2 * N];
int ans1 = inf, ans2 = - inf;

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
    
    for (int i = 1; i <= 2 * n; i++) sum[i] = sum[i - 1] + a[i > n ? i % n : i];
    
    for (int i = 1; i <= 2 * n; i++) d[i][i] = 0;
    for (int len = 2; len <= n; len++) {
        for (int i = 1; i + len - 1 <= 2 * n; i++) {
            int j = i + len - 1;
            d[i][j] = inf;
            for (int k = i; k < j; k++) {
                d[i][j] = min(d[i][j], d[i][k] + d[k + 1][j] + sum[j] - sum[i - 1]);
            }
        }
    }
    for (int i = 1; i <= n; i++) ans1 = min(ans1, d[i][i + n - 1]);

    for (int i = 1; i <= 2 * n; i++) e[i][i] = 0;
    for (int len = 2; len <= n; len++) {
        for (int i = 1; i + len - 1 < 2 * n; i++) {
            int j = i + len - 1;
            e[i][j] = - inf;
            for (int k = i; k < j; k++) {
                e[i][j] = max(e[i][j], e[i][k] + e[k + 1][j] + sum[j] - sum[i - 1]);
            }
        }
    }
    
    for (int i = 1; i <= n; i++) ans2 = max(ans2, e[i][i + n - 1]);
    
    printf("%d\n%d\n", ans1, ans2);
    
    return 0;
}

 8. 状态压缩 DP (Unaccepted)

 

转载于:https://www.cnblogs.com/greyqz/p/7211033.html

相关文章:

  • A useful UrlBuilder class
  • 图解面向对象中的聚合与耦合概念
  • Linux工具使用(5)——FTP
  • Linux下高并发socket最大连接数所受的各种限制
  • 基础研究与国家目标——国家重点基础研究发展计划[转自科学社]
  • java 设计模式 -- 责任链模式
  • CSS的覆盖问题
  • ATL接口返回类型ATL接口返回字符串BSTR*
  • 深入理解JavaScript系列(15):函数(Functions)
  • Android通过浏览器打开app页面并且传递值
  • 腾讯从社群端整治淘宝客,90%的淘客群被封
  • Linux 下Android 开发环境搭建 ---CentOS
  • 测试工程师工作流程概论
  • 静态
  • sql脚本中出现SQL SQL 以及 列名重命名不显示问题
  • 2017年终总结、随想
  • CSS实用技巧
  • java8 Stream Pipelines 浅析
  • Mysql5.6主从复制
  • Node项目之评分系统(二)- 数据库设计
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Vue实战(四)登录/注册页的实现
  • 闭包--闭包作用之保存(一)
  • 测试开发系类之接口自动化测试
  • 当SetTimeout遇到了字符串
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 关于springcloud Gateway中的限流
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 区块链分支循环
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 实现菜单下拉伸展折叠效果demo
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 为什么要用IPython/Jupyter?
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • # 安徽锐锋科技IDMS系统简介
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #define,static,const,三种常量的区别
  • #NOIP 2014# day.2 T2 寻找道路
  • $.proxy和$.extend
  • (13):Silverlight 2 数据与通信之WebRequest
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (二)JAVA使用POI操作excel
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (一)u-boot-nand.bin的下载
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)ORM
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)