UVA - 10817 Headmaster's Headache

来源:互联网 发布:税收数据治理的对策 编辑:程序博客网 时间:2024/05/08 02:30

花了四个多小时做这道题,碰到这样不算难但自己解决不好的题才意识到自己各个方面的不足。

开始,我自己能够想到要用状态压缩的背包来解决。课有些问题一直没搞清楚,因为每个老师能教的课程不一定非得他交,我就认为状态转移时还要考虑各门课教还是不交,然后初始化也是一样。这样就比较麻烦,最后我还是写出来了,但复杂度太高,TLE,然后才发现不一定非要考虑教还是不交,因为遍历的时候每种状态都会考虑,这样,只要初始化的时候考虑教还是不交就可以了,这里我想了很久才明白过来,然后还是WA,最后对比了别人的代码才发现遍历j的时候错误的从1开始了。。。

#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>#define MAXS 9#define MAXN 110#define X 65610+100#define INF0x7f7f7f7fusing namespace std;int s,m,n,teacher[MAXN][MAXS+1];int ans,have[MAXS],initstatet;int dp[MAXN][X],limit;int encode(int*p){//编码int level=1,ret=0;for(int i=1;i<=s;i++){ret+=level*p[i];level*=3;}return ret;}void decode(int code,int *p){//译码for(int i=1;i<=s;i++){p[i]=code%3;code/=3;}}void getinit(int index,int value,int power){if(index>s)return ;for(int i=0;i<=min(have[index],2);i++){dp[0][value+power*i]=ans;getinit(index+1,value+power*i,power*3);}}void init(){ans=0;memset(have,0,sizeof(have));memset(teacher,0,sizeof(teacher));memset(dp,0x7f,sizeof(dp));initstatet=0;limit=pow(3,s);int num;char ch;for(int i=1;i<=m+n;){scanf("%d%c",&num,&ch);if(i<=m){ans+=num;}else{teacher[i-m][0]=num;}while(ch!='\n'){scanf("%d%c",&num,&ch);if(i<=m){have[num]++;}else{teacher[i-m][num]=1;}}i++;}getinit(1,0,1);}void solve(){int state[MAXS]={0};for(int i=1;i<=n;i++){for(int j=0;j<limit;j++){decode(j,state);for(int t=1;t<=s;t++){state[t]=max(0,state[t]-teacher[i][t]);}int code=encode(state);dp[i][j]=min(dp[i-1][j],dp[i-1][code]+teacher[i][0]);}}}int main(){while(~scanf("%d %d %d",&s,&m,&n)&&s){init();solve();//for(int i=0;i<=n;i++){//for(int j=0;j<limit;j++)//cout<<dp[i][j]<<' ';//cout<<endl;//}cout<<dp[n][limit-1]<<endl;}return 0;}

0 0
原创粉丝点击