/*
  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. 【BZOJ1101】[POI2007] Zap(莫比乌斯反演)

    点此看题面 大致题意: 求\(\sum_{x=1}^N\sum_{y=1}^M[gcd(x,y)==d]\). 一道类似的题目 推荐先去做一下这道题:[洛谷2257]YY的GCD,来初步了解一下莫比乌 ...

  2. 【BZOJ3925】[ZJOI2015] 地震后的幻想乡(状压期望DP)

    点此看题面 大致题意: 有\(n\)个点和\(m\)条边,每条边的权值是一个\(0\sim1\)的随机实数,要你用\(n-1\)条边将图联通,问这\(n-1\)条边中边权最大值的期望最小值. 提示 这 ...

  3. Java 程序设计总复习题

    Java程序设计总复习题 1.编写一个Java程序在屏幕上输出“你好!”. //programme name Helloworld.java public class Helloworld { pub ...

  4. vue2.0父子组件以及非父子组件通信

    官网API: https://cn.vuejs.org/v2/guide/components.html#Prop 一.父子组件通信 1.父组件传递数据给子组件,使用props属性来实现 传递普通字符 ...

  5. 【dp】奶牛家谱 Cow Pedigrees

    令人窒息的奶牛题 题目描述 农民约翰准备购买一群新奶牛. 在这个新的奶牛群中, 每一个母亲奶牛都生两个小奶牛.这些奶牛间的关系可以用二叉树来表示.这些二叉树总共有N个节点(3 <= N < ...

  6. 【SAM manacher 倍增】bzoj3676: [Apio2014]回文串

    做法一:PAM:做法二:SAM+manacher.前缀树上倍增 Description 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你 ...

  7. Oracle - 存储过程、函数、包的使用练习-雇员

    --存储过程范例:得到雇员表 emp 的记录数 begin --说明:若过程中要向外抛异常,请使用 exception when others then raise; 这个抛出的异常在程序里是可以捕获 ...

  8. 认识mysql(3)

    认识mysql第三篇,发出的内容适合初学者,如果能持续关注我的博客,可以全面的掌握mysql的常用知识,后续我也会陆续发出python相关的知识,关注我,和我一共进步吧! 1.SQL查询 1.执行顺序 ...

  9. ZendFramework-2.4 源代码 - 关于服务管理器

    // ------ 决定“服务管理器”配置的位置 ------ // 1.在模块的入口类/data/www/www.domain.com/www/module/Module1/Module.php中实 ...

  10. Linux常见的系統进程

    前言 在日常运维工作中,经常会看到一些奇怪的系统进程占用资源比较高.而且总是会听到业务线同学询问“xxx这个是啥进程啊?咋开启了这么多?” 而这些系统级的内核进程都是会用中括号括起来的,它们会执行一些 ...