zoukankan      html  css  js  c++  java
  • codeforces George and Job

     1 /*
     2     题意:给一个长度为n的序列, 从中选择长度为m的k个区间(任意两个区间不会有公共部分)
     3     使得所选择的区间的和最大!
     4     思路:这是一种很常见的dp
     5     
     6     dp[i][j] 表示的是前 i 个数选择 j 个 长度为m区间的最大和! 
     7     s[i]记录的是前 i 个数字的和! 
     8     dp[i][j] = max( dp[i - 1][j], dp[i - m][j - 1] + s[i] - s[i-m] );
     9 */
    10 #include<iostream>
    11 #include<cstdio>
    12 #include<cstring>
    13 #include<algorithm>
    14 #define N 5005
    15 using namespace std;
    16 typedef long long ll;
    17 
    18 ll dp[N][N];
    19 ll s[N];
    20 
    21 int main(){
    22     int n, m, k;
    23     scanf("%d%d%d", &n, &m, &k);
    24     for(int i = 1; i <= n; ++i){
    25         scanf("%lld", &s[i]);
    26         s[i] += s[i-1];
    27     }
    28     
    29     for(int j = 1; j <= k; ++j)
    30         for(int i = j*m; i <= n; ++i)
    31            dp[i][j] = max( dp[i - 1][j], dp[i - m][j - 1] + s[i] - s[i-m] );
    32            
    33     printf("%lld
    ", dp[n][k]);
    34     
    35     return 0; 
    36 }
    附一个经典的dp!

    题意: 给定2个字符串a, b,求b的子序列在a中出现的次数。要求可以是不连续的,但是b在a中的顺序必须和b以前的一致。 思路: dp[i][j]表示:b的前j个字符在a的前i个字符中出现的次数。 似乎这种表示方法司空见惯,但是一开始我还真没能搞懂如何去递推。事情的真相是: 如果a[i]
    == b[j]则 dp[i][j] = dp[i-1][j] + dp[i-1][j-1];
    如果a[i]
    != b[j]则 dp[i][j] = dp[i-1][j];
  • 相关阅读:
    ubuntu14.04显卡驱动问题(amd5600k集显7650d)
    win7 ubuntu 14.04双系统安装
    func_num_args, func_get_arg, func_get-args 的区别与用法
    wamp2.5版本64位403forbidden问题
    mysql根据汉字拼音排序查询
    php判断浏览器语言
    php批量下载文件
    php搜索分页
    把ZenCart在线商店搭建到本地
    livezilla账号或密码修改方法
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/3991460.html
Copyright © 2011-2022 走看看