标签:log others input play math edit 嵌套 swap 题解
数字三角形
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<queue> 7 #include<map> 8 #include<set> 9 #include<vector> 10 #include<cstdlib> 11 #include<string> 12 #define eps 0.000000001 13 typedef long long ll; 14 typedef unsigned long long LL; 15 using namespace std; 16 const int N=100+10; 17 int mp[N][N]; 18 int dp[N][N]; 19 int main(){ 20 int t; 21 int n; 22 scanf("%d",&t); 23 while(t--){ 24 scanf("%d",&n); 25 for(int i=1;i<=n;i++) 26 for(int j=1;j<=i;j++)scanf("%d",&mp[i][j]); 27 int maxx=0; 28 for(int i=n-1;i>=1;i--) 29 for(int j=1;j<=i;j++){ 30 mp[i][j]+=max(mp[i+1][j],mp[i+1][j+1]); 31 } 32 cout<<mp[1][1]<<endl; 33 } 34 }
矩形嵌套 (DAG)
有n个矩形 每个矩形有长和宽a b;要使x矩形可以嵌套在y矩形内 必须(x.a<y.a&&x.b<y.b 或者 x.a<y.b&&x.b<y.a);
现在问你选出最多的矩形排成一行 使除了最后以后矩形之外 每个矩形都可以嵌套在下一个矩形
1 10 1 2 2 4 5 8 6 10 7 9 3 1 5 8 12 10 9 7 2 2
5
题解:首先我们先让每个矩形的长的边 按照从大到小的排个序 Vis[i][j]表示第j个矩形可以嵌套在第i个矩形内
所以我们可以遍历比较一遍 最终根据vis[i][j]得到的就是一个有向无环图
dp[i]表示从节点i出发的最长路长度 ,那么转移方程就是dp[i]=max(dp[j]+1,vis[i][j]=1)
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<map> 5 #include<cstdlib> 6 #include<vector> 7 #include<set> 8 #include<queue> 9 #include<cstring> 10 #include<string.h> 11 #include<algorithm> 12 #define INF 0x3f3f3f3f 13 typedef long long ll; 14 typedef unsigned long long LL; 15 using namespace std; 16 const int N=1000+10; 17 int vis[1005][1006]; 18 struct node{ 19 int x,y; 20 }a[N]; 21 int ans[N]; 22 bool cmp(node xx,node yy){ 23 if(xx.x==yy.x)return xx.y>yy.y; 24 else 25 return xx.x>yy.x; 26 } 27 int main(){ 28 int t; 29 scanf("%d",&t); 30 while(t--){ 31 memset(ans,0,sizeof(ans)); 32 memset(vis,0,sizeof(vis)); 33 int n; 34 scanf("%d",&n); 35 // scanf("%d",&n); 36 for(int i=0;i<n;i++){ 37 scanf("%d%d",&a[i].x,&a[i].y); 38 if(a[i].x<a[i].y)swap(a[i].x,a[i].y); 39 } 40 sort(a,a+n,cmp); 41 for(int i=0;i<n;i++) 42 for(int j=i+1;j<n;j++){ 43 if(a[i].x>a[j].x&&a[i].y>a[j].y)vis[j][i]=1; 44 } 45 int maxx=0; 46 for(int i=0;i<n;i++){ 47 ans[i]=1; 48 for(int j=0;j<n;j++){ 49 if(vis[i][j]==1&&ans[i]<ans[j]+1) 50 ans[i]=ans[j]+1; 51 } 52 } 53 // for(int i=0;i<n;i++)cout<<ans[i]<<" "; 54 // cout<<endl; 55 for(int i=0;i<n;i++)maxx=max(ans[i],maxx); 56 cout<<maxx<<endl; 57 } 58 }
最长公共字串和最长公共子序列
拿例子来看吧 X:bacabcefabc Y: baeabcghabc
最长公共字串:abc(字符串必须是连续的 )
最长公共子序列:abcabc(可以不连续)
<1> 最长公共字序列:dp[i][j] 表示储存Xi Yj的最长公共子序列长度
假如 i=0或者j=0 dp[i][j]=0;
假如 i>0&&j>0 Xi==Yj dp[i][j]=dp[i-1][j-1]+1;
假如i>0&&j>0 Xi!=Yj dp[i][j]=max(dp[i-1][j],dp[i][j-1])(自己想想应该很好理解的);
来看一道题:
2 asdf adfsd 123abc abc123abc
3 6
代码板子
<2>最长公共字串
标签:log others input play math edit 嵌套 swap 题解
原文地址:http://www.cnblogs.com/Aa1039510121/p/6567404.html