/*
  uva 111
* 题意:
* 顺序有变化的最长公共子序列;
* 模板;
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int a[];
int mu[];
int Dp[][]; int main()
{
int n,x;
scanf("%d", &n);
for(int i=;i<=n;i++)
{
scanf("%d", &x);
mu[x] = i;
}
while(scanf("%d", &x)!=EOF)
{
a[x] = ;
for(int i=;i<=n;i++)
{
scanf("%d", &x);
a[x] = i;
}
memset(Dp,, sizeof(Dp) );
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
if(a[i] == mu[j])
Dp[i][j] = Dp[i-][j-] +;
else
Dp[i][j] = max(Dp[i-][j], Dp[i][j-]);
}
}
printf("%d\n",Dp[n][n]);
}
return ;
}
/*
* uva103
* 题意:
* DAG最长路;
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int cube[][];
int G[][];
int Dp[];
int pre[];
int n,di;
void Dfs(int u)
{
for(int i=;i<=n;i++)
{
if(i==u)
continue;
if( G[u][i]!= - )
{
if(Dp[i] < Dp[u]+G[u][i])
{
Dp[i] = Dp[u] + G[u][i];
pre[i] = u;
Dfs(i);
}
}
}
}
void print(int u)
{
if(pre[u]!=-)
print(pre[u]);
if(pre[u]!= -)
printf(" ");
printf("%d", u);
}
int main()
{
while(scanf("%d%d", &n,&di)!=EOF)
{
for(int i=;i<=n;i++)
for(int j=; j<di; j++)
scanf("%d", &cube[i][j]);
memset(G, -, sizeof(G));
memset(pre, -, sizeof(pre));
for(int i=;i<=n;i++)
sort(cube[i],cube[i]+di);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
if(i==j)
continue;
int flag = ;
for(int x =;x<di;x++)
if( cube[i][x] >= cube[j][x])
{
flag = ;
break;
}
if( !flag )
G[i][j] = ;
}
for(int i=;i<=n;i++)
Dp[i] = ;
for(int i=;i<=n;i++)
Dfs(i);
int ans =;
for(int i=;i<=n;i++)
{
if(Dp[ans] < Dp[i])
ans =i;
}
printf("%d\n", Dp[ans]);
print(ans);
printf("\n");
}
return ;
}
/*
* uva10405
* 题意:
* LCS;
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n1, n2;
char s1[],s2[];
int Dp[][];
int LCS()
{
memset(Dp, , sizeof(Dp));
for(int i=;i<=n1; i++)
for(int j=; j<=n2; j++)
if( s1[i] == s2[j] )
Dp[i][j] = Dp[i-][j-] + ;
else
Dp[i][j] = max(Dp[i-][j], Dp[i][j-]);
return Dp[n1][n2];
}
int main()
{
while(gets(s1+)&& gets(s2+))
{
n1 = strlen(s1+);
n2 = strlen(s2+);
int ans = LCS();
printf("%d\n",ans);
}
return ;
}
/*
* uva10003
* 区间Dp
* 题意,给一个序列是要切开的位置,每次切一刀的代价是当前段的全长;
* 最小代价;
* 在区间开始和结尾加上0 和全长;
* 枚举区间 长度、起点;
* 这里的长度是跨越的要切的位置的个数,不是真正的长度;
* 对于每一段内,枚举段内分割点,然后Dp出段内最小代价,直到全长;
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[],len,n;
int Dp[][];
int INF = 0x3f3f3f3f;
int main()
{
while(scanf("%d", &len )!=EOF && len )
{
memset(Dp, , sizeof(Dp));
scanf("%d", &n);
for(int i=;i<=n;i++)
scanf("%d", &a[i]);
a[] = ;
a[n+] = len;
//区间Dp
//Dp[i][j]表示左闭右开的区间i,j;
for(int p = ; p <= n+ ; p++)
for(int i = ; i+p <= n+ ; i++)
{
int j = i+p;
int Min = INF;
for(int k=i+; k<j;k++)
Min = min(Min, Dp[i][k]+Dp[k][j]+a[j]-a[i]);
if( Min != INF )
Dp[i][j] = Min;
}
printf("The minimum cutting is %d.\n",Dp[][n+]);
}
return ;
}
/*
* uva116
* 简单的Dp,前缀最小要倒着DP
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
int a[][];
int Dp[][];
int Next[][];
void print(int i,int j)
{
if(j<=)
return ;
print(Next[i][j], j-);
if(j>)
printf(" ");
printf("%d",Next[i][j]);
}
int main()
{
while(scanf("%d%d", &n, &m)!=EOF)
{
for(int i=;i<=n;i++)
for(int j = ;j<=m;j++)
scanf("%d", &a[i][j]);
memset(Dp, 0x3f, sizeof(Dp));
for(int i=;i<=n;i++)
Dp[i][m] = a[i][m];
for(int i=m-;i>;i--)
{
for(int j=;j<=n;j++)
{
int s[]={j-,j,j+};
if(j-==) s[] = n;
if(j+>n) s[] = ;
sort(s,s+);
int t = s[];
Dp[j][i] = Dp[t][i+] + a[j][i];
Next[j][i] = t;
t = s[] ;
if(Dp[j][i] > Dp[t][i+] + a[j][i])
{
Dp[j][i] = Dp[t][i+] + a[j][i];
Next[j][i] = t;
}
t = s[] ;
if(Dp[j][i] > Dp[t][i+]+a[j][i])
{
Dp[j][i] = Dp[t][i+] + a[j][i];
Next[j][i] = t;
}
}
}
int ans =;
for(int i=;i<=n;i++)
if(Dp[ans][] > Dp[i][])
ans = i;
// print(ans,m);
printf("%d",ans);
int x =ans, y=;
while(y<m)
{
printf(" %d", Next[x][y]);
x = Next[x][y];
y++;
}
printf("\n%d\n",Dp[ans][]); }
return ;
}
/*
* uva562
* 给一列数,分成两堆,两堆的差最小;
* 0-1背包处理出所有可能的和;
* 然后从一半开始往下扫;
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[];
int Dp[]; int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n;
scanf("%d", &n);
for(int i=;i<n;i++)
scanf("%d", &a[i]);
int sum = ;
for(int i=;i<n;i++)
sum += a[i];
memset(Dp, , sizeof(Dp));
Dp[] = ;
for(int j=; j<n;j++)
for(int i= sum; i>=a[j]; i--)
if(!Dp[i]) Dp[i] = Dp[i-a[j]];
for(int i=sum/;i>=;i--)
if(Dp[i])
{
printf("%d\n",sum-i-i);
break;
}
}
return ;
}
/*************************************************************************
> File Name: uva348.cpp
> Author: Baiyan
> 题意:给一列矩阵的尺寸,问怎么样的计算顺序会使计算的次数最少
>
> Created Time: 2016年04月19日 星期二 22时52分37秒
**********************************************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
int a[],b[];
int Dp[][];
int vis[][];
void print(int l,int r)
{
if(r-l>)
{
printf("(");
print(l,vis[l][r]);
printf(" x ");
print(vis[l][r]+,r);
printf(")");
}
else
printf("A%d",l);
}
int main()
{
int n,k=;
while(scanf("%d", &n)!=EOF && n)
{
for(int i=;i<=n;i++)
scanf("%d%d", &a[i], &b[i]);
memset(Dp, , sizeof(Dp));
memset(vis,, sizeof(vis));
for(int p = ;p<n;p++)
{
for(int i= ;i+p<=n;i++)
{
int j = i+p;
Dp[i][j] = INF;
for(int k = i; k<j; k++)
{
if(k==j)
Dp[k][j] = ;
if(i==k)
Dp[i][k] = ;
if(Dp[i][j] >= Dp[i][k]+Dp[k+][j]+a[i]*b[j]*b[k])
{
vis[i][j] = k;
Dp[i][j] = Dp[i][k] + Dp[k+][j] + a[i]*b[j]*b[k];
}
}
}
}
printf("Case %d: ", k++);
print(,n);
printf("\n");
}
return ;
}

简单Dp----最长公共子序列,DAG最长路,简单区间DP等的更多相关文章

  1. 动态规划1——最长递增子序列、最长公共子序列、最长公共子串(python实现)

    目录 1. 最长递增序列 2. 最长公共子序列 3. 最长公共子串 1. 最长递增序列 给定一个序列,找出其中最长的,严格递增的子序列的长度(不要求连续). 解法一:动态规划 通过一个辅助数组记录每一 ...

  2. [Python]最长公共子序列 VS 最长公共子串[动态规划]

    前言 由于原微软开源的基于古老的perl语言的Rouge依赖环境实在难以搭建,遂跟着Rouge论文的描述自行实现. Rouge存在N.L.S.W.SU等几大子评估指标.在复现Rouge-L的函数时,便 ...

  3. [Data Structure] LCSs——最长公共子序列和最长公共子串

    1. 什么是 LCSs? 什么是 LCSs? 好多博友看到这几个字母可能比较困惑,因为这是我自己对两个常见问题的统称,它们分别为最长公共子序列问题(Longest-Common-Subsequence ...

  4. 用Python计算最长公共子序列和最长公共子串

    如何用Python计算最长公共子序列和最长公共子串 1. 什么是最长公共子序列?什么是最长公共子串? 1.1. 最长公共子序列(Longest-Common-Subsequences,LCS) 最长公 ...

  5. 最长公共子序列与最长公共字串 (dp)转载http://blog.csdn.net/u012102306/article/details/53184446

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  6. 【ZH奶酪】如何用Python计算最长公共子序列和最长公共子串

    1. 什么是最长公共子序列?什么是最长公共子串? 1.1. 最长公共子序列(Longest-Common-Subsequences,LCS) 最长公共子序列(Longest-Common-Subseq ...

  7. 最长公共子序列PK最长公共子串

    1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. (1)递归方法求最长公共子序列的长度 1) ...

  8. 动态规划(一)——最长公共子序列和最长公共子串

    注: 最长公共子序列采用动态规划解决,由于子问题重叠,故采用数组缓存结果,保存最佳取值方向.输出结果时,则自顶向下建立二叉树,自底向上输出,则这过程中没有分叉路,结果唯一. 最长公共子串采用参考串方式 ...

  9. 动态规划 最长公共子序列 LCS,最长单独递增子序列,最长公共子串

    LCS:给出两个序列S1和S2,求出的这两个序列的最大公共部分S3就是就是S1和S2的最长公共子序列了.公共部分 必须是以相同的顺序出现,但是不必要是连续的. 选出最长公共子序列.对于长度为n的序列, ...

  10. POJ-1458.CommonSubsequence.(DP:最长公共子序列裸题)

    本题大意:给出两个字符串,让你求出最长公共子序列的长度并输出. 本题思路:本题是经典的DP问题,由于是两个字符串,那么我们就用一个二维数组来进行区分,用dp[ i ][ j ]来表示在s1和s2中分别 ...

随机推荐

  1. Opentsdb简介

    1.OpenTSDB介绍 1.1.OpenTSDB是什么?主要用途是什么? 官方文档这样描述:OpenTSDB is a distributed, scalable Time Series Datab ...

  2. HP刀片服务器安装系统步骤

    原文链接 HP刀片服务器安装系统步骤: HP刀片使用一个叫OA(Onboard Administrator)的管理平台统一进行管理,具有很高的集成性,同时使用起来也很简单方便,通过IE浏览器输入IP地 ...

  3. rand()和srand()

    C++中rand() 函数的用法 1.rand()不需要参数,它会返回一个从0到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数. 2.如果你要产生0~99这100个整数中的一个随机整数, ...

  4. nginx安装php环境

    1.php下载地址 https://secure.php.net/downloads.php(此次安装版本为7.0.33) 2.安装依赖的包 yum -y install libxml2 yum -y ...

  5. 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程

    点击了解更多Python课程>>> 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程 适用人群: 即将毕业的大学生,工资低工作重的白领,渴望崭露头角的职场新人, ...

  6. 网站动态加载JS脚本

    Demo_1 function loadJS(url, fn) { var ss = document.getElementsByName('script'), loaded = false; for ...

  7. python 斗图图片爬虫

    捣鼓了三小时,有一些小Bug,望大佬指导 废话不说,直接上代码: #!/usr/bin/python3 # -*- coding:UTF-8 -*- import os,re,requests fro ...

  8. mongodb安装,库操作,集合操作(表),文档操作(记录)

    安装 1.下载地址 https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-4.0.8-signed.msi 2.如果报没 ...

  9. 字符编码笔记:ASCII、Unicode和UTF-8

    1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte). ...

  10. 洛谷 P2205 [USACO13JAN]画栅栏

    这题其实没什么,但用到的算法都十分有用.做一个不恰当的比喻,这是一只必须用牛刀杀的鸡,但因为我这个蒟蒻杀不死牛,所以只能找只鸡来练练手. 题目描述 Farmer John 想出了一个给牛棚旁的长围墙涂 ...