zoukankan      html  css  js  c++  java
  • AtCoder Regular Contest 100 E

    一道很好的dp题
    dp[K]存的是 i满足二进制1属于K二进制1位置 最大的两个Ai
    这样dp[K]统计的两个数肯定满足(i | j) <= K
    然后不断做 update(dp[i | (1<<j)], dp[I])

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <ctime>
    using namespace std;
    typedef long long ll;
    const int N = 262200;
    const ll INF = 1e18;
    
    int A[N];
    pair<int, int> dp[N];
    
    void update(pair<int,int> &A, int x) {
    	if(x > A.second) {
    		A.second = x;
    		if(A.second > A.first) {
    			swap(A.second, A.first);
    		}
    	}
    }
    int main() {
    	int n;
    	while(~scanf("%d", &n)) {
    		int nLen = (1<<n) - 1;
    	
    		for(int i = 0; i <= nLen; ++i) {
    			scanf("%d", &A[i]);
    			dp[i] = make_pair(A[i], -1);
    		}
    
    		for(int i = 0; i < n; ++i) {
    			for(int j = 0; j <= nLen; ++j) {
    				if( ((j >> i) & 1) == 0 ) {
    					int newI = j | (1 << i);
    					int t1 = dp[j].first;
    					int t2 = dp[j].second;
    					update(dp[newI], t1);
    					update(dp[newI], t2);
    				}
    			}
    		}
    
    	//	for(int i = 0; i <= nLen; ++i) printf("%d %d
    ", dp[i].first, dp[i].second);
    		int ans = -1;
    		for(int i = 1; i <= nLen; ++i) {
    			ans = max(ans, dp[i].first + dp[i].second);
    			printf("%d
    ", ans);
    		} 
    	}
    	return 0;
    }
    
  • 相关阅读:
    对我影响最大的三位老师
    自我介绍
    第二周作业
    2019第一次作业
    PTA编程总结3
    币值转换
    PTA编程总结2
    PTA编程总结1
    秋季学期学习总结
    人生路上对你影响最大的三位老师
  • 原文地址:https://www.cnblogs.com/Basasuya/p/9277242.html
Copyright © 2011-2022 走看看