hdu 1069 最长上升子序列变形
2015-07-15 20:27
302 查看
因为每种block都有无限多个,所以(x,y,z)等价于是(x,y,z)+(x,z,y)+(y,z,x)这三种block。
然后就像是矩形嵌套那样求解,只不过状态转移方程变成了:
dp[i] = max( dp[i], dp[j] + z[i] );
代码如下:
然后就像是矩形嵌套那样求解,只不过状态转移方程变成了:
dp[i] = max( dp[i], dp[j] + z[i] );
代码如下:
#include <algorithm> #include <cstdio> using namespace std; const int N = 100; int dp ; struct Node { int x, y, z; bool operator < ( const Node & o ) const { if ( x != o.x ) return x < o.x; return y < o.y; } Node(){} Node( int _x, int _y, int _z ) { x = _x, y = _y, z = _z; } void standard() { if ( x > y ) swap( x, y ); } } node ; int main () { int n, _case = 1; while ( scanf("%d", &n), n ) { for ( int i = 0; i < n; i++ ) { int x, y, z; scanf("%d%d%d", &x, &y, &z); node[i * 3] = Node( x, y, z ); node[i * 3].standard(); node[i * 3 + 1] = Node( x, z, y ); node[i * 3 + 1].standard(); node[i * 3 + 2] = Node( y, z, x ); node[i * 3 + 2].standard(); } sort( node, node + 3 * n ); int ans = -1; for ( int i = 0; i < 3 * n; i++ ) { dp[i] = node[i].z; for ( int j = 0; j < i; j++ ) { if ( node[j].x < node[i].x && node[j].y < node[i].y ) { dp[i] = max( dp[i], dp[j] + node[i].z ); } } ans = max( ans, dp[i] ); } printf("Case %d: maximum height = %d\n", _case++, ans); } return 0; }
相关文章推荐
- Codeforces 164 E Compatible Numbers
- 产生不大于100的随机正整数,用户通过键盘对随机正整数进行猜测,猜大了给用户提示猜大,猜小提示猜小, 猜对了则提示“恭喜,猜对了”,结束游戏。
- 产生不大于100的随机正整数,用户通过键盘对随机正整数进行猜测,猜大了给用户提示猜大,猜小提示猜小, 猜对了则提示“恭喜,猜对了”,结束游戏。
- SQL中CONVERT转化函数的用法
- QQ游戏百万人同时在线服务器架构实现
- PHP + Memcache 实现多服务器session共享 (补充)
- POJ 1258
- CentOS 安装 Maven
- WPF 画线动画效果实现
- JAVA基本语法--java的数据类型
- 插值器 animation动画
- 【西祠日志】【01】第一天工作,我想,这是一个新的开始
- 跳槽
- FAST特征点检测算法
- POJ 1751
- LOAD DATA LOCAL INFILE
- Tracking-Learning-Detection (TLD算法总结)
- 网络电视精灵
- POJ 2349
- HDU 5166 Missing number