zoukankan      html  css  js  c++  java
  • Codeforces 10D LCIS 求最长公共上升子序列及输出这个子序列 dp

    版权声明:本文为博主原创文章,未经博主同意不得转载。

    https://blog.csdn.net/qq574857122/article/details/34430283

    题目链接:点击打开链接

    题意:

    给定n长的一个序列

    再给定k长的一个序列

    求LCIS并输出这个子序列

    如有多解输出随意解。。

    = - = 敲的时候听着小曲儿pre的含义还没有想清楚。万万没想到就过了。。


    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #include<set>
    #include<vector>
    #include<map>
    #include<math.h>
    #include<string>
    #include<stdlib.h>
    #include<algorithm>
    using namespace std;
    #define N 505
    int a[N],s[N];
    int n, k;
    int dp[N][N];
    int pre[N][N][2];
    int is[N][N];
    vector<int>G;
    int main(){
    	int i,j,co;
    	while(~scanf("%d",&n)){
    		G.clear();
    		for(i=1;i<=n;i++)scanf("%d",&a[i]);
    		scanf("%d",&k);
    		for(i=1;i<=k;i++)scanf("%d",&s[i]);
    		memset(dp, 0, sizeof dp);
    		memset(pre, 0, sizeof pre);
    		memset(is, 0, sizeof is);
    		for(i=1;i<=n;i++) {
    			int maxx = 0;
    			int x = 0, y = 0;
    			for(j=1;j<=k;j++)
    			{
    				dp[i][j] = dp[i-1][j];
    				if(a[i]>s[j] && maxx < dp[i-1][j]) {
    					maxx = dp[i-1][j];
    					if(is[i-1][j])
    						x = i-1, y = j;
    					else {
    						x = pre[i-1][j][0];
    						y = pre[i-1][j][1];
    					}
    				}
    				if(a[i]==s[j]) {
    					is[i][j] = 1;
    					dp[i][j] = maxx + 1;
    					if(is[x][y])
    						pre[i][j][0] = x, pre[i][j][1] = y;
    					else {
    						pre[i][j][0] = pre[x][y][0];
    						pre[i][j][1] = pre[x][y][1];
    					}
    					continue;
    				}
    				if(is[i-1][j])
    					pre[i][j][0] = i-1, pre[i][j][1] = j;
    				else {
    					pre[i][j][0] = pre[i-1][j][0];
    					pre[i][j][1] = pre[i-1][j][1];
    				}
    			}
    		}
    		int ans = 0;
    		int x = n, y = k;
    		for(i=1;i<=k;i++)if(ans<dp[n][i]){
    			ans = dp[n][i];
    			x = n, y = i;
    		}
    		printf("%d
    ",ans);
    		if(!ans)continue;
    		while(x+y) {
    			if(is[x][y])G.push_back(a[x]);
    			int x1 = pre[x][y][0];
    			int y1 = pre[x][y][1]; 
    			x = x1 , y = y1;
    		}
    		for(i=G.size()-1; i>=0; i--){
    			printf("%d",G[i]);
    			i?

    printf(" "):puts(""); } } return 0; } /* 2 1 2 3 1 2 3 */



查看全文
  • 相关阅读:
    C#之获取本地IP地址
    C#中对Excel进行操作
    C#中的TCP通讯与UDP通讯
    Flex 学习
    正则表达式实例
    sass调试--页面看到sass文件而不是css文件问题
    webpack+vue-loader 在单独.vue组件中使用sass-loader编译sass报错问题not a valid Win32 applictation
    SVG图案填充-Pattern
    jQuery小技巧
    代码整洁一
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10963921.html
  • Copyright © 2011-2022 走看看