zoukankan      html  css  js  c++  java
  • AC Challenge(状压dp)

    ACM-ICPC 2018 南京赛区网络预赛E:

    题目链接https://www.jisuanke.com/contest/1555?view=challenges

    Dlsj is competing in a contest with n (0 < n le 20)n(0<n20) problems. And he knows the answer of all of these problems.

    However, he can submit ii-th problem if and only if he has submitted (and passed, of course) s_isi problems, the p_{i, 1}pi,1-th, p_{i, 2}pi,2-th, ......, p_{i, s_i}pi,si-th problem before.(0 < p_{i, j} le n,0 < j le s_i,0 < i le n)(0<pi,jn,0<jsi,0<in) After the submit of a problem, he has to wait for one minute, or cooling down time to submit another problem. As soon as the cooling down phase ended, he will submit his solution (and get "Accepted" of course) for the next problem he selected to solve or he will say that the contest is too easy and leave the arena.

    "I wonder if I can leave the contest arena when the problems are too easy for me."
    "No problem."
    —— CCF NOI Problem set

    If he submits and passes the ii-th problem on tt-th minute(or the tt-th problem he solve is problem ii), he can get t imes a_i + b_it×ai+bi points. (|a_i|, |b_i| le 10^9)(ai,bi109).

    Your task is to calculate the maximum number of points he can get in the contest.

    Input

    The first line of input contains an integer, nn, which is the number of problems.

    Then follows nn lines, the ii-th line contains s_i + 3si+3 integers, a_i,b_i,s_i,p_1,p_2,...,p_{s_i}ai,bi,si,p1,p2,...,psias described in the description above.

    Output

    Output one line with one integer, the maximum number of points he can get in the contest.

    Hint

    In the first sample.

    On the first minute, Dlsj submitted the first problem, and get 1 imes 5 + 6 = 111×5+6=11 points.

    On the second minute, Dlsj submitted the second problem, and get 2 imes 4 + 5 = 132×4+5=13 points.

    On the third minute, Dlsj submitted the third problem, and get 3 imes 3 + 4 = 133×3+4=13 points.

    On the forth minute, Dlsj submitted the forth problem, and get 4 imes 2 + 3 = 114×2+3=11 points.

    On the fifth minute, Dlsj submitted the fifth problem, and get 5 imes 1 + 2 = 75×1+2=7 points.

    So he can get 11+13+13+11+7=5511+13+13+11+7=55 points in total.

    In the second sample, you should note that he doesn't have to solve all the problems.

    样例输入1

    5
    5 6 0
    4 5 1 1
    3 4 1 2
    2 3 1 3
    1 2 1 4

    样例输出1

    55

    样例输入2

    1
    -100 0 0

    样例输出2

    0

    题目来源

    ACM-ICPC 2018 南京赛区网络预赛

    题意:输入n 代表有道题目,接下来有n行,代表n道题目(从1--n),每一行先输入三个数 a b s,  s代表后面还要输入s道题目的序号,

    每解决完一道题目将花费一分钟的时间,每解决一道题目可以得到 (a*t + b)分(t代表时间,从0开始),而每道题目可以被解决前提是

    它所对应的s道题目要先被解决,求可以得到的最大分数。

    0<n<20

    |a|,|b|<=1e9

    思路:状压dp,具体实现请看代码

    #include<cstdio>
    #include<algorithm>
    #define ll long long
    #define mn -1e16
    using namespace std;
    int bit[1<<20];//记录每种状态下1的个数,相当与记录了到该状态时的时间(因为每一道题已被解决该状态下的二进制数对应的位置就为1,每做一道题要1分钟的时间) 
    int pre[1<<20];//用状态压缩来记录解题条件 
    ll dp[1<<22];
    struct{
    	ll a,b;
    }s[22];
    int check(int a){
    	int i,sum;
    	sum=0;
    	for(i=0;i<20;i++){//记算1的个数 
    		if((1<<i)&a)
    		sum++;
    	}
    	//printf("%d %d
    ",a,sum);
    	return sum;
    }
    void init(){//预处理,求出对应状态下的时间 
    	for(int i=0;i<(1<<20);i++){
    		bit[i]=check(i);
    	}
    }
    int main(){
    	int n;
    	int i,j,k;
    	int p;
    	init();
    	ll ans=0;
    	scanf("%d",&n);
    	for(i=1;i<=n;i++){
    		scanf("%lld%lld%d",&s[i].a,&s[i].b,&k);
    		while(k--){//解题条件,记录要解决该题先要完成的题目 
    			scanf("%d",&p);
    			pre[i]|=(1<<(p-1));//二进制记录条件 
    		}
    	}
    	dp[0]=0;
    	for(i=1;i<(1<<n);i++){
    		dp[i]=mn;
    		for(j=0;j<n;j++){ 
    			if(i&(1<<j)){//找该状态下已被做的题目的情况  
    				int f=i-(1<<j);//找寻第j题被做之前的情况 
    				if((f&pre[j+1])==pre[j+1]&&dp[f]!=mn){//找寻满足条件并且已经遍历过的状态来推出现在的状态 
    					dp[i]=max(dp[i],dp[f]+s[j+1].a*bit[i]+s[j+1].b);
    				}
    			}
    		}
    		ans=max(ans,dp[i]);
    	}
    	printf("%lld
    ",ans);
    	return 0;
    } 
    

      

     

  • 相关阅读:
    Dialog中添加多选按钮CheckBox
    把格式日期转换成毫秒
    监听EditText输入事件
    浅析LocationManager的位置定位
    Android 字体设置
    Android开发之InstanceState详解
    Bash中自动补全时忽略大小写
    51与PC通信协议设计及实现(九):更深入的扩展
    推到重做
    51与PC通信协议设计及实现(五):问题收集解决随笔
  • 原文地址:https://www.cnblogs.com/cglongge/p/9643920.html
Copyright © 2011-2022 走看看