SRM 559 div 2【AK】

250pt.

题意:给定n块砖,编号0~n-1,选一定的砖摞起来,要求上面的砖编号比下面的大,并且偶数高度的不能放在奇数高度的上面,求最大高度。

解法: dp[i][0]记录选完前i块并且此时最上面一块高度为偶数的最优解

    dp[i][1]记录选完前i块并且此时最上面一块高度为奇数的最优解。。。

250pt
 1 #include<iostream>
 2 #include<string>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 #define N 100
 7 using namespace std;
 8 int dp[N][2];
 9 class BlockTower{
10     public:
11         int getTallest(vector <int> s){
12             int len=s.size();
13             memset(dp,0,sizeof(dp));
14             if(s[0]&1)
15             dp[0][1]=s[0];
16             else dp[0][0]=s[0];
17             for(int i=1;i<len;i++){
18                 if(s[i]&1){
19                     dp[i][1]=max(dp[i-1][0]+s[i],dp[i-1][1]+s[i]);
20                     dp[i][0]=dp[i-1][0];
21                 }else{
22                     dp[i][1]=dp[i-1][1];
23                     dp[i][0]=dp[i-1][0]+s[i];
24                 }
25             }
26             return max(dp[len-1][0],dp[len-1][1]);
27         }
28 };

500pt.

题意:给定一个r*c的棋盘,每个棋子有八个移动方向,求这个棋盘中有多少个位置能使棋子有k个合法的移动方向。

解法:棋盘中特定的区域内棋子的合法移动数是一定的,分情况讨论即可。

500pt
 1 #include<iostream>
 2 #include<string>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 using namespace std;
 7 typedef long long ll;
 8 class HyperKnight{
 9     public:
10         long long countCells(int a, int b, int R, int C, int k){
11             ll ans=0;
12             ll aa=min(a,b);
13             ll bb=max(a,b);
14             if(k==0||k==1||k==5||k==7)ans=0;
15             else if(k==2){
16                 ans=aa*aa*4;
17             }else if(k==3){
18                 ans+=(bb-aa)*aa*8;
19             }else if(k==4){
20                 ans+= (C-2*bb)*aa*2;
21                 ans+=(bb-aa)*(bb-aa)*4;
22                 ans+=(R-2*bb)*aa*2;
23             }else if(k==6){
24                 ans+=(bb-aa)*(C-2*bb)*2;
25                 ans+=(bb-aa)*(R-2*bb)*2;
26             }else if(k==8){
27                 ans=(C-2*bb)*(R-2*bb);
28             }
29             return ans;
30         }
31 };

1000pt.

题意:...

解法:对于一个给定的情况,因为只能添加'S',所以如果有可能的方案,那么方案只有一种。

    用r[i][j],d[i][j]记录i行j列的拼图向右和向下的缺口是什么,0表示没有缺口,1表示凸出,-1表示凹进。

   最初枚举一下每个格子,按要求添加'S'就行。如果能够添加完,再判断是否合法。

   如果整个拼图是合法的,那么每一行的d值和每一列的r值之和都应该是0

1000pt
  1 #include<iostream>
  2 #include<cstring>
  3 #include<string>
  4 #include<algorithm>
  5 #include<vector>
  6 #define M 55
  7 using namespace std;
  8 class ToyTrain{
  9     public:
 10         int getMinCost(vector <string> s){
 11             int r[M][M],d[M][M];
 12             int hash[M];
 13             bool v[M][M];
 14             memset(hash,0,sizeof(hash));
 15             memset(r,0,sizeof(r));
 16             memset(d,0,sizeof(d));
 17             int ans=0;
 18             for(int i=0;i<s.size();i++){
 19                 for(int j=0;j<s[i].size();j++){
 20                     int up,right;
 21                     up=right=0;
 22                     if(j-1>=0) right=r[i][j-1];
 23                     if(i-1>=0) up=d[i-1][j];
 24                     if(s[i][j]=='.'||(s[i][j]>='0'&&s[i][j]<='9')){
 25                         if(right==0&&up==0)continue;
 26                         else if(!(right!=0&&up!=0)){
 27                             r[i][j]=right;
 28                             d[i][j]=up;
 29                             if(s[i][j]>='0'&&s[i][j]<='9'){
 30                                 if(!hash[s[i][j]-'0']){
 31                                     ans+=(s[i][j]-'0');
 32                                     hash[s[i][j]-'0']=1;
 33                                 }
 34                             }
 35                             s[i][j]='S';
 36                         }
 37                         else return -1;
 38                     }
 39                     else if(s[i][j]=='A'){
 40                         if(right==0&&up==0){
 41                             r[i][j]=1;d[i][j]=1;
 42                         }
 43                         else if(right==0&&up!=0){
 44                             if(up==1){
 45                                 return -1;
 46                             }
 47                             else{
 48                                 r[i][j]=1;
 49                                 d[i][j]=0;
 50                             }
 51                         }
 52                         else if(right!=0&&up==0){
 53                             if(right==1){
 54                                 return -1;
 55                             }
 56                             else{
 57                                 r[i][j]=0;
 58                                 d[i][j]=1;
 59                             }
 60                         }
 61                         else{
 62                             if(!(right==-1&&up==-1))
 63                              return -1;
 64                         }
 65                     }
 66                     else if(s[i][j]=='B'){
 67                         if(right==0&&up==0){
 68                             r[i][j]=-1;
 69                             d[i][j]=-1;
 70                         }
 71                         else if(right==0&&up!=0){
 72                             if(up==-1){
 73                                 return -1;
 74                             }
 75                             else{
 76                                 r[i][j]=-1;
 77                                 d[i][j]=0;
 78                             }
 79                         }
 80                         else if(right!=0&&up==0){
 81                             if(right==-1){
 82                                 return -1;
 83                             }
 84                             else{
 85                                 r[i][j]=0;
 86                                 d[i][j]=-1;
 87                             }
 88                         }
 89                         else{
 90                             if(!(right==1&&up==1))
 91                             return -1;
 92                         }
 93                     }
 94                     else{
 95                         if(right==up){
 96                             return -1;
 97                         }
 98                         else if(right==0&&up!=0){
 99                             r[i][j]=0;
100                             d[i][j]=up;
101                         }
102                         else if(right!=0&&up==0){
103                             d[i][j]=0;
104                             r[i][j]=right;
105                         }
106                     }
107                 }
108             }
109             memset(v,0,sizeof(v));
110             bool flag=0;
111             for(int i=0;i<s.size();i++){
112                 int sum=0;
113                 for(int j=0;j<s[i].size();j++){
114                     sum+=d[i][j];
115                     if(s[i][j]=='A'||s[i][j]=='B'||s[i][j]=='S')flag=1;
116                 }
117                 if(sum!=0)return -1;
118             }
119             for(int j=0;j<s[0].size();j++){
120                 int sum=0;
121                 for(int i=0;i<s.size();i++){
122                     sum+=r[i][j];
123                 }
124                 if(sum!=0)return -1;
125             }
126             if(flag==0)return -1;
127             else return ans;
128         }
129 };
posted @ 2012-10-31 16:39  silver__bullet  阅读(199)  评论(0编辑  收藏  举报