您的位置:首页 > 其它

HD 48DP 1069(最长递增子序列)?

2018-04-02 20:59 274 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1069

别人的方法和我有点不一样- -?我的是真的暴力。。。。不过也可以优化。不过数据很小也懒得了。

#include <bits/stdc++.h>
#define INF 1e18
#define inf 1e9
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define IOS ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std ;
typedef long long ll;
typedef unsigned long long ull;
const int _max = 35*6;
struct node{
int x,y,z;
}a[_max];
int dp[_max],n,cnt;
bool cmp(node n1,node n2){
if(n1.x == n2.x)
return n2.y<n1.y;
else
return n1.x>n2.x;
}
void solve(int i,node n1){
a[i+n] = n1; swap(a[i+n].x,a[i+n].y);
a[i+2*n] = n1; swap(a[i+2*n].y,a[i+2*n].z);
a[i+3*n] = a[i+2*n]; swap(a[i+3*n].x,a[i+3*n].y);
a[i+4*n] = a[i+2*n]; swap(a[i+4*n].x,a[i+4*n].z);
a[i+5*n] = a[i+4*n]; swap(a[i+5*n].x,a[i+5*n].y);
}
int main(){
int Cas=0;
while(cin>>n && n){
cnt = -inf;
for(int i = 1 ; i <= n ; i++){
cin>>a[i].x>>a[i].y>>a[i].z;
solve(i,a[i]);
}
n*=6;
sort(a+1,a+n+1,cmp);
for(int i = 1 ; i <= n ; i++)
dp[i] = a[i].z;
for(int i = 2 ; i <= n ; i++){
for(int j = 1 ; j < i ; j++){
if(a[i].x < a[j].x && a[i].y < a[j].y){
dp[i] = max(dp[i],dp[j]+a[i].z);
}
}
cnt = max(cnt,dp[i]);
}
/*      for(int i = 1 ; i <= n ; i++)
cout<<a[i].x<<' '<<a[i].y<<' '<<a[i].z<<endl;

for(int i = 1 ; i <= n ; i++)
cout<<dp[i]<<' ';
cout<<endl;
*/
cout<<"Case "<<++Cas<<": maximum height = ";
cout<<cnt<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  HDOJ DP