/*
  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. FETCH - 用游标从查询中抓取行

    SYNOPSIS FETCH [ direction { FROM | IN } ] cursorname where direction can be empty or one of: NEXT P ...

  2. vs code vim

    很多初学者启动vim后,不知道怎么输入字符:按了半天字母,结果屏幕还是空的. vim和记事本或WORD不一样,不是一打开后就可以输入文字,此时它处于正常模式. vim一共有4个模式: 正常模式 (No ...

  3. OneNote- 面经

  4. Java中的异常处理从概念到实例

    1.概念 采用新的异常处理机制 在以往的程序开发过程中,经常采用返回值进行处理.例如,在编写一个方法,可以返回一个状态代码,调用者根据状态代码判定出错与否.若状态代码表示一个错误,则调用这进行相应的处 ...

  5. java基础面试题:抽象类中是否可以有静态的main方法?

  6. Java发出声卡蜂鸣生的方法

    方法一: Toolkit.getDefaultToolkit().beep(); 方法二: System.out.println('\007');//八进制数

  7. 在基于vue-cli的项目自定义打包环境

    在工作当中,遇到了下面这个问题: 测试环境与生产环境中的用户权限不一样,因此,就需要根据测试环境打一个包,生产环境又打一个包.可是,如果每次打包都需要更改权限的配置文件的话,会很麻烦,而且,体现不出一 ...

  8. js数据结构与算法--递归

    递归,函数自己调用自己 return 返回值, 后面的代码不执行 function fn(num){ console.log(num) if(num == 0){ return; } fn(num-1 ...

  9. 23.VUE学习之-列表的排序sort

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 第48课 thinkphp5添加商品库

    目录 思路: 1. html页面里属性下拉框里的值是从goods_attr联attr里的查出来传到模板里的.在属性的下拉栏里展示出来 2. html页面里用二维数组的结构goods_attr[{$k} ...