简单Dp----最长公共子序列,DAG最长路,简单区间DP等
/*
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——最长递增子序列、最长公共子序列、最长公共子串(python实现)
目录 1. 最长递增序列 2. 最长公共子序列 3. 最长公共子串 1. 最长递增序列 给定一个序列,找出其中最长的,严格递增的子序列的长度(不要求连续). 解法一:动态规划 通过一个辅助数组记录每一 ...
- [Python]最长公共子序列 VS 最长公共子串[动态规划]
前言 由于原微软开源的基于古老的perl语言的Rouge依赖环境实在难以搭建,遂跟着Rouge论文的描述自行实现. Rouge存在N.L.S.W.SU等几大子评估指标.在复现Rouge-L的函数时,便 ...
- [Data Structure] LCSs——最长公共子序列和最长公共子串
1. 什么是 LCSs? 什么是 LCSs? 好多博友看到这几个字母可能比较困惑,因为这是我自己对两个常见问题的统称,它们分别为最长公共子序列问题(Longest-Common-Subsequence ...
- 用Python计算最长公共子序列和最长公共子串
如何用Python计算最长公共子序列和最长公共子串 1. 什么是最长公共子序列?什么是最长公共子串? 1.1. 最长公共子序列(Longest-Common-Subsequences,LCS) 最长公 ...
- 最长公共子序列与最长公共字串 (dp)转载http://blog.csdn.net/u012102306/article/details/53184446
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- 【ZH奶酪】如何用Python计算最长公共子序列和最长公共子串
1. 什么是最长公共子序列?什么是最长公共子串? 1.1. 最长公共子序列(Longest-Common-Subsequences,LCS) 最长公共子序列(Longest-Common-Subseq ...
- 最长公共子序列PK最长公共子串
1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. (1)递归方法求最长公共子序列的长度 1) ...
- 动态规划(一)——最长公共子序列和最长公共子串
注: 最长公共子序列采用动态规划解决,由于子问题重叠,故采用数组缓存结果,保存最佳取值方向.输出结果时,则自顶向下建立二叉树,自底向上输出,则这过程中没有分叉路,结果唯一. 最长公共子串采用参考串方式 ...
- 动态规划 最长公共子序列 LCS,最长单独递增子序列,最长公共子串
LCS:给出两个序列S1和S2,求出的这两个序列的最大公共部分S3就是就是S1和S2的最长公共子序列了.公共部分 必须是以相同的顺序出现,但是不必要是连续的. 选出最长公共子序列.对于长度为n的序列, ...
- POJ-1458.CommonSubsequence.(DP:最长公共子序列裸题)
本题大意:给出两个字符串,让你求出最长公共子序列的长度并输出. 本题思路:本题是经典的DP问题,由于是两个字符串,那么我们就用一个二维数组来进行区分,用dp[ i ][ j ]来表示在s1和s2中分别 ...
随机推荐
- 浅谈前端性能优化(二)——对HTTP传输进行压缩
1.前端性能优化的一点: 对js.css.图片等进行压缩,尽可能减小文件的大小,减少文件下载的时间,从而减少网页响应的时间. 2.前端性能优化的另一点: 对HTTP传输进行压缩,即在js,css.图片 ...
- 【BZOJ4650】[NOI2016] 优秀的拆分(后缀数组)
点此看题面 大致题意: 定义将一个字符串拆成\(AABB\)的形式为优秀拆分,求一个字符串所有子串的优秀拆分个数. 后缀数组 这题可是一道后缀数组黑题啊. 其实看完题解这题还是挺简单的. 大致思路 显 ...
- 如何在python中读写和存储matlab的数据文件(*.mat)
使用sicpy.io即可.sicpy.io提供了两个函数loadmat和savemat,非常方便. 以前也有一些开源的库(pymat和pymat2等)来做这个事, 不过自从有了numpy和scipy以 ...
- vue中created、mounted等方法整理
- jfinal excel表导出
在自己的WEB项目中要用到导出Excel,所以结合网络上的资源写了一个自己的export 工具类. 说明: JFinal 环境 WEB项目 JAVA后台生成非JS插件 好了,直接撸代码 1.设置文件保 ...
- Linux入门-第七周
1.编写脚本实现传入进程PID,查看对应进程/proc下CPU.内存指标. #!/bin/bash read -p "Input PID Value: " pid #读取PID进程 ...
- linux三剑客之sed深度实践
参数: -a:追加文本到指定行后 -i:插入文本到指定行前 1.单行增加 [root@redhat~]# sed ' 2a 6,f ' linux.tet 1,a 2,b 6,f 3,c 4 ...
- ATM-db-dnhandler
import os,jsonfrom conf import settings def select(name): user_path = os.path.join(settings.BASE_DB, ...
- ATM-conf-settings
import os BASE_DIR = os.path.dirname(os.path.dirname(__file__))BASE_DB = os.path.join(BASE_DIR, 'db' ...
- 学习Spring框架系列(一):通过Demo阐述IoC和DI的优势所在
Spring框架最核心东西便是大名鼎鼎的IoC容器,主要通过DI技术实现.下面我通过Demo的演变过程,对比学习耦合性代码,以及解耦和的过程,并深入理解面向接口编程的真正内涵. 这个例子包括如下几个类 ...