/*
  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. 【洛谷3950】部落冲突(LCT维护连通性)

    点此看题面 大致题意: 给你一棵树,\(3\)种操作:连一条边,删一条边,询问两点是否联通. \(LCT\)维护连通性 有一道类似的题目:[BZOJ2049][SDOI2008] Cave 洞穴勘测. ...

  2. 动态规划专题(四)——单调队列优化DP

    前言 单调队列优化\(DP\)应该还算是比较简单容易理解的吧,像它的升级版斜率优化\(DP\)就显得复杂了许多. 基本式子 单调队列优化\(DP\)的一般式子其实也非常简单: \[f_i=max_{j ...

  3. python 基础之列表切片内置方法

    列表操作 c=['cx','zrd','ajt','dne'] #定义一个列表,有4个元素 #增删改查 print(c[3]) #从0计数 测试 D:\python\python.exe D:/unt ...

  4. vmware:使用.zip文件在vmware中安装操作系统

    问题描述: 之前在vmware中安装系统时,全部都是加载的.iso文件来实现.后面同事给了一个zip包,解压后是".vmdk"等一系列具体的文件.一时间不知道怎么安装系统了,搜网页 ...

  5. 牛客小白月赛5 F 圆(circle) 【欧拉定理】

    题目连接: https://www.nowcoder.com/acm/contest/135/F 签到题来了,送你们一个Python秒的题. Apojacsleam来到了OI大陆,经过了连年征战,成为 ...

  6. SPOJ2713GSS4 - Can you answer these queries IV(线段树)

    题意 Sol 讲过无数次了..很显然,一个$10^12$的数开方不超过$8$次后就会变为$1$ 因此直接暴力更改即可,维护一下这段区间是否被全改为了$1$ 双倍经验:https://www.luogu ...

  7. MySQL基础 - 1 数据库基础

    一.数据库基础 1.什么是数据库 1.数据库(database)是保存有组织的数据的容器( 通常是一个文件或一组文件 ) 2.数据库是一个以某种有组织的方式存储的数据集合 注意:数据库软件应该称为DB ...

  8. 【Python学习之十】yield之send方法

    yield作用 简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator.下面以斐波拉 ...

  9. vue.js 四(指令和自定义指令)

    官方的指令说明已经很简单了,这里再写一遍,也是自己加深一下印象 v-text 就是写入单纯的文本,可以忽略这个指令直接双花括号代替 <span v-text="msg"> ...

  10. <Docker学习>1. 简介

    Q: Dokcer是什么? A: 是一种虚拟化技术.参考https://www.imooc.com/learn/867快速了解Docker. Q: 传统虚拟机技术和Dokcer的区别? A: 传统虚拟 ...