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 };