标签:alt mission nal limit chmod key 状态压缩 turn tin
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1820 Accepted Submission(s): 1034
1 //2017-08-02 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 6 using namespace std; 7 8 int arr[22][22]; 9 int dp[22][20000], sum[22][20000];//dp[i][j]表示第i行使用第j种方法所能得到的最大值,sum[i][j]表示第i行使用第j种方法所得的和 10 int state[20000];//表示可行的状态,即可行的取数方法 11 int len, n; 12 13 bool ok(int sta)//可行状态,即1的位置两两不相邻 14 { 15 return (sta&(sta<<1))==0 ? true : false; 16 } 17 18 int get_sum(int pos, int x)//求第pos行,使用x方法能取得的和 19 { 20 int sum = 0, cnt = 1; 21 while(x) 22 { 23 sum += (x%2)*arr[pos][n-cnt]; 24 x >>= 1; 25 cnt++; 26 } 27 return sum; 28 } 29 30 void init(int m)//初始化 31 { 32 len = 0; 33 for(int i = 0; i < (1<<m); i++) 34 if(ok(i))state[len++] = i; 35 for(int i = 0; i < n; i++) 36 for(int j = 0; j < len; j++) 37 sum[i][j] = get_sum(i, state[j]); 38 memset(dp, 0, sizeof(dp)); 39 for(int i = 0; i < len; i++) 40 dp[0][i] = sum[0][i]; 41 } 42 43 void read(){ 44 char str[200]; 45 int row = 0; 46 while(cin.getline(str, 200)){ 47 if(strlen(str) == 0)break; 48 for(int i = 0; i < strlen(str); i+=3){ 49 arr[row][i/3] = (str[i]-‘0‘)*10+(str[i+1]-‘0‘); 50 } 51 row++; 52 } 53 n = row; 54 } 55 56 int main() 57 { 58 while(1) 59 { 60 read(); 61 if(n == 0)break; 62 init(n); 63 for(int i = 1; i < n; i++)//处理第i行 64 for(int j = 0; j < len; j++)//采取第j种方法 65 for(int k = 0; k < len; k++)//枚举上一行所采取的方法k 66 if((state[j]&state[k])==0 && ((state[j]<<1)&state[k])==0 && ((state[j]>>1)&state[k])==0)//方法j、k可行。 67 dp[i][j] = max(dp[i][j], dp[i-1][k]+sum[i][j]);//状态转移方程 68 69 int ans = 0; 70 for(int i = 0; i < len; i++)//找出最大值 71 if(dp[n-1][i]>ans) 72 ans = dp[n-1][i]; 73 74 cout<<ans<<endl; 75 } 76 return 0; 77 }
HDU2167(SummerTrainingDay02-D 状态压缩dp)
标签:alt mission nal limit chmod key 状态压缩 turn tin
原文地址:http://www.cnblogs.com/Penn000/p/7277802.html