动态规划(简单)

1.最长公共子序列

char a[1005];
char b[1005];
int ans[1005][1005];
int mmp(){
int lena=strlen(a);
for (int i=0;i<=lena;i++)
    ans[i][1]=0;
int lenb=strlen(b);
for (int i=0;i<=lenb;i++)
    ans[1][i]=0;
for (int i=1;i<=lena;i++){
    for (int j=1;j<=lenb;j++){
        if(a[i-1]==b[j-1])
            ans[i][j]=ans[i-1][j-1]+1;
        else ans[i][j]=max(ans[i-1][j],ans[i][j-1]);
    }
 }
return ans[lena][lenb];
}

2.最长公共子序列(最长上升子序列写法)

void jie(){
   int n,p,q,dp,right,left,mid;
 
   scanf("%d%d%d",&n,&p,&q);
   p++;
   q++;
   int m;
   int top;
   memset(a,0,sizeof(a));
   for (int i=1;i<=p;i++){
    scanf("%d",&m);
    a[m]=i;
   }
   ans[0]=top=0;
   for (int i=1;i<=q;i++){
    scanf("%d",&m);
     dp=a[m];
    if(!dp) continue;
    if(dp>ans[top]){
        ans[++top]=dp;
    }
    else {
        left=0;
        right=top;
        mid;
        while(1){
            mid=(right+left)/2;
            if(mid==left) break;
            if(dp>ans[mid])
                left=mid;
            else
                right=mid;
        }
        ans[mid+1]=dp;
     }
   }
   printf("%d\n",top);
}

3.最长上升子序列

#include<stdio.h>
#include<string.h>
#include<algorithm>
usingnamespacestd;
int a[100000];
int chang[100000];
int main(){
    int n;
    scanf("%d",&n);
    int sum=1;
    int cnt=0;
    int flag;
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
        chang[i]=1;
    }
    for(int i=1;i<n;i++){
        for(int j=0;j<i;j++){
            if(a[i]>a[j]){
                chang[i]=max(chang[i],chang[j]+1);
            }
             if(chang[i]>sum)sum=chang[i];
        }
    }
    printf("%d\n",sum);
    return0;
}

4.最长上升子序列(二分)

#include<stdio.h>
int a[100000];
int ans[100000];
int main(){
int n;
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
    scanf("%d",&a[i]);
}int top=1;
ans[1]=a[1];for (int i=2;i<=n;i++){
    if(ans[top]<a[i])
        ans[++top]=a[i];
    else{
        int mid;
        int left=1;
        int right=top;
        while(left<=right){
            mid=(left+right)/2;
            if(a[i]>ans[mid])
                left=mid+1;
            else right=mid-1;
        }
        ans[left]=a[i];
    }
}
printf("%d\n",top);
return0;
}
时间: 2024-11-05 12:25:53

动态规划(简单)的相关文章

动态规划 简单的分割问题的解决方案钢棒

代码第一版 : #include <iostream> using namespace std; int max(int a,int b) { if(a>=b)return a; else return b; } int cut_rod(int *p,int n) { int q=NULL; if(n==0)return 0; else for(int i=0;i<n;i++) { q=max(q,p[i]+cut_rod(p,n-1-i)); } return q; } int

51nod 1021 石子归并 (动态规划 简单代码)

题目: 思路:动态规划,递推式子 dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + sum[j] - sum[i-1]);     dp[i][j]表示合并第i到第j个石子需要的最少代价.sum[i]表示前i个石子的价值,sum[j] - sum[i-1]即合成两堆石子((第i到第k合并出的石子),(第k+1到第j合并出的石子)). 但是考虑要求1-4, 需要先求出(1-1,2-4),(1-2,3-4),(1-3,4-4). 所以我们不能直接按横纵

算法一(动态规划)

运筹学:依照给定的条件和目标,从众多方案中选择最佳方案!动态规划是运筹学的重要分支之一,是解决多阶段决策过程最优化的一种方法. 动态规划简单地说就是:采用分治的策略,把求最优解问题分解为求若干个子问题的最优解,子问题也递归地分解为子问题的组合,通过递归递推等方法,把原问题最优解与局部子问题最优解联系起来,以求最后的解.这些局部子问题之间可能有重叠,就是某个子问题可能需要求解多次,因此需要将子问题及其解记录下来,这样对每个子问题只需求解一次,从而提高了效率. 原问题最优当且仅当子问题最优 以LIS

学习笔记:动态规划

最近写了一些动态规划……简单总结一下 区间DP 做了好多道感觉都非常套路……就感觉都和合并石子长一个样.无非就是区间从短到长依次更新,然后还有一些奇奇怪怪的转移方法(这个就因题而异了).区间DP唯一考点可能就是这些奇奇怪怪的判断了…… 树形DP 树这种东西,一般都是从子树的状态然后转移到父亲(然而并不全是).一般看到树形DP先想能不能从子树转移,如果不能再考虑其他奇奇怪怪(?)的方法. 做树形DP的时候做到了一个叫基环树的东西,这玩意儿满足一个性质,他带环.…… 环上的边任意删去一条然后就成了一

(动态规划、递归) leetcode 87. Scramble String

思路:用递归来做感觉比动态规划简单,题目让我们判断s1和s2是否是scramble string,则s1上(从左起计数)有一个长度为 i 的分割点将s1分为s1_l 和 s1_r 两段 分别与 s2的(从左起计数一个长度为i的) s2_l 和 s2_r 互为 scramble string:或者与 s2的(从右起计数一个长度为i的)s2.substr(s-i) 和 s2.substr(0, s-i) 互为 scramble string . 1)C++ 中的 substr(pos, len) 表

待刷题目分类

各大OJ题目归类 Posted on 2012 年 8 月 8 日 by admin ---------–最优化问题------------- --------动态规划 SOJ1162 I-Keyboard SOJ2096 Maximum Submatrix SOJ2111 littleken bg SOJ2505 The County Fair SOJ2818 QQ音速 SOJ2469 Exploring Pyramids SOJ1833 Base Numbers SOJ2009 Zeros

PAT1007. Maximum Subsequence Sum

Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, Ni+1, ..., Nj } where 1 <= i <= j <= K. The Maximum Subsequence is the continuous subsequence which has the largest sum of its elements. For examp

剑指Offer对答如流系列 - 剪绳子

面试题13:剪绳子 题目描述 给你一根长度为n绳子,请把绳子剪成m段(m.n都是整数,n>1并且m>1).每段的绳子的长度记为k[0].k[1].--.k[m].k[0]*k[1]*-*k[m]可能的最大乘积是多少? 例如当绳子的长度是8时,我们把它剪成长度分别为2.3.3的三段,此时得到最大的乘积18. 问题分析 (1)思路一:动态规划 遇到问题,先分析问题,由分析的结果确定所运用的算法. 一般而言,我们都会在纸上动笔画画,罗列一些基本的情况. 题中说n>1并且m>1,那么 当n

简单理解算法篇--动态规划

动态规划方法通常用来求解最优化问题,这些问题有很多种解,但我们希望寻求最优解. 满足两个条件既可以使用动态规划 1.具有最优子结构 2.子问题重叠 至于这两点是什么意思?先看个问题 现在有个钢筋长度和价格对应的表,问:给你个长度为n的钢筋怎么卖最划算? 长度 1 2 3 4  5   6  7   8   9  10 价格 1 5 8 9 10 17 17 20 24 30 现在就是要把所有的切法都遍历一遍,找出最划算的切法,当你把钢筋切了一刀后,是不是变成了两段?那就要考虑的就是这两段怎么切最

HDUOJ----2571(命运)(简单动态规划)

命运 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8600    Accepted Submission(s): 3032 Problem Description 穿过幽谷意味着离大魔王lemon已经无限接近了! 可谁能想到,yifenfei在斩杀了一些虾兵蟹将后,却再次面临命运大迷宫的考验,这是魔王lemon设下的又一个机关.要知