hdu 1069 最长上升子序列变形

因为每种block都有无限多个,所以(x,y,z)等价于是(x,y,z)+(x,z,y)+(y,z,x)这三种block。

然后就像是矩形嵌套那样求解,只不过状态转移方程变成了:

  dp[i] = max( dp[i], dp[j] + z[i] );

代码如下:

 1 #include <algorithm>
 2 #include <cstdio>
 3 using namespace std;
 4
 5 const int N = 100;
 6 int dp[N];
 7
 8 struct Node
 9 {
10     int x, y, z;
11     bool operator < ( const Node & o ) const
12     {
13         if ( x != o.x ) return x < o.x;
14         return y < o.y;
15     }
16     Node(){}
17     Node( int _x, int _y, int _z )
18     {
19         x = _x, y = _y, z = _z;
20     }
21     void standard()
22     {
23         if ( x > y ) swap( x, y );
24     }
25 } node[N];
26
27 int main ()
28 {
29     int n, _case = 1;
30     while ( scanf("%d", &n), n )
31     {
32         for ( int i = 0; i < n; i++ )
33         {
34             int x, y, z;
35             scanf("%d%d%d", &x, &y, &z);
36             node[i * 3] = Node( x, y, z );
37             node[i * 3].standard();
38             node[i * 3 + 1] = Node( x, z, y );
39             node[i * 3 + 1].standard();
40             node[i * 3 + 2] = Node( y, z, x );
41             node[i * 3 + 2].standard();
42         }
43         sort( node, node + 3 * n );
44         int ans = -1;
45         for ( int i = 0; i < 3 * n; i++ )
46         {
47             dp[i] = node[i].z;
48             for ( int j = 0; j < i; j++ )
49             {
50                 if ( node[j].x < node[i].x && node[j].y < node[i].y )
51                 {
52                     dp[i] = max( dp[i], dp[j] + node[i].z );
53                 }
54             }
55             ans = max( ans, dp[i] );
56         }
57         printf("Case %d: maximum height = %d\n", _case++, ans);
58     }
59     return 0;
60 }
时间: 2024-08-03 16:18:11

hdu 1069 最长上升子序列变形的相关文章

HDU 1160 FatMouse&#39;s Speed 动态规划 记录路径的最长上升子序列变形

题目大意:输入数据直到文件结束,每行两个数据 体重M 和 速度V,将其排列得到一个序列,要求为:体重越大 速度越低(相等则不符合条件).求这种序列最长的长度,并输出路径.答案不唯一,输出任意一种就好了. 题目思路:这是个最长上升子序列的问题,我们按W的升序进行排序,若W相等则按V的降序排序.用Pre[]记录当前点的前驱节点,Last记录序列最后一个点,maxn记录最长长度,完成动规后可根据Last和Pre[]输出路径. #include<cstdio> #include<stdio.h&

hdu 1950 最长上升子序列

1 //Accepted 3540 KB 62 ms 2 //dp 最长上升子序列 3 #include <cstdio> 4 #include <cstring> 5 #include <iostream> 6 using namespace std; 7 const int imax_n = 400005; 8 int dp[imax_n]; 9 int d[imax_n]; 10 int a[imax_n]; 11 int n; 12 int len; 13 in

HDU 1243 最长公共子序列

反恐训练营 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2850    Accepted Submission(s): 648 Problem Description 当今国际反恐形势很严峻,特别是美国“9.11事件”以后,国际恐怖势力更是有恃无恐,制造了多起骇人听闻的恐怖事件.基于此,各国都十分担心恐怖势力会对本国社会造成的不稳定,

【HDU】5256 序列变换(最长上升子序列变形)

如果a[i]和a[j]想不变,需要满足的条件就是 a[j] - a[i] > j - i 也就是a[i] - i < a[j] - j 比如1 4 2 就不满足,所以1和2之间一定有一个需要改变 所以我们对所有a[i] - i求其最长上升子序列就可以了 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 100005; con

vijos P1028 最长上升子序列变形题

#include<iostream> #include<cstdio> #include<cstring> #include<map> #include<string> #include<vector> #include<algorithm> using namespace std; bool judge(const string &aa,const string &bb) { for(int i=0;i&

hdu1243(最长公共子序列变形)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1243 分析:dp[i][j]表示前i个子弹去炸前j个恐怖分子得到的最大分.其实就是最长公共子序列加每个字母值为1,这里每个字母代表的值变化了一下. 状态转移方程:if(s1[i-1]==s2[j-1])dp[nxt][j]=dp[cur][j-1]+val[s1[i-1]];                              else  dp[nxt][j]=max(dp[nxt][j-1]

NYOJ 36 &amp;&amp;HDU 1159 最长公共子序列(经典)

链接:click here 题意:tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列. 输入 第一行给出一个整数N(0<N<100)表示待测数据组数 接下来每组数据两行,分别为待测的两组字符串.每个字符串长度不大于1000. 输出 每组测试数据输出一个整数,表示最长公共子序列长度.每组

HDU 5784 最长上升子序列的长度nlgn(固定尾部)

Bellovin Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 858    Accepted Submission(s): 395 Problem Description Peter has a sequence a1,a2,...,an and he define a function on the sequence -- F(

HDU 1025 最长上升子序列

首先根据第一个数排序,然后可以得到一串第二个数组成的序列,因为第一个由大到小排列,所以第二组中取到的数据,后面的不能比前面的小才不会形成交叉,那么也就是求这个新序列的最长公共子序列 这里要用到最长上升子序列的nlogn的算法,新建一个数组保存所有合理的数据的数组g,比如g数组中有了1,4,6,加进来一个3 , 那么4可以被3代替因为在同一个位置尽可能小能容纳的数据个数就会越多,越能找到更长的序列,这个找位置的过程就用二分搜索logn的复杂度 注意一点,我是因为这个好久没做出....就是边数大于1