第 298 场周赛
![](https://img2022.cnblogs.com/blog/1601092/202206/1601092-20220619231555225-890006086.png)
暴力解决
1 class Solution: 2 def greatestLetter(self, s: str) -> str: 3 a=[0]*66 4 b=[0]*66 5 # str=input() 6 7 for ch in s: 8 if ch.isupper(): 9 a[ord(ch)-ord("A")]=1 10 if ch.islower(): 11 b[ord(ch)-ord("a")]=1 12 ans=-1 13 # print(a[:27]) 14 # print(b[:27]) 15 for i in range(26): 16 if (a[i]==1 and b[i]==1): 17 ans=i 18 # print(ans) 19 20 p="" 21 if ans==-1: 22 return p; 23 else: 24 p=chr(ord("A")+ans) 25 return p;
BFS暴力遍历
1 const int N = 2e5+10; 2 int vis[N]; 3 struct node{ 4 int a,b; 5 bool operator < (const node &t)const{ 6 return b>t.b; 7 } 8 }; 9 class Solution { 10 public: 11 int minimumNumbers(int num, int k) { 12 if(!num) return 0; 13 if(num<k) return -1; 14 if(k==2&&num%2) return -1; 15 vector<int> f; 16 f.clear(); 17 memset(vis,0,sizeof(vis)); 18 priority_queue<node> q; 19 for(int i=1;i<=num;i++){ 20 if(i%10==k){ 21 if(i==num) return 1; 22 f.push_back(i); 23 q.push({i,1}); 24 } 25 } 26 if(f.size()==0) return -1; 27 if(num==f[0]){ 28 return 1; 29 } 30 int ans=-1; 31 while(!q.empty()){ 32 node u=q.top(); 33 q.pop(); 34 if(vis[u.a]) continue; 35 vis[u.a]=1; 36 for(auto x:f){ 37 int tmp=u.a+x; 38 if(tmp>num) continue; 39 else if(tmp==num){ 40 ans=u.b+1; 41 break; 42 }else{ 43 q.push({tmp,u.b+1}); 44 } 45 } 46 } 47 return ans; 48 } 49 };
贪心的思想:字符为0全选,字符为1的个数通过二分进行选取。由于给定K的范围可以知道二分右端点不会超过31.
1 class Solution: 2 def longestSubsequence(self, s: str, k: int) -> int: 3 a=[] 4 tot=0 5 for i in range(len(s)): 6 if s[i]=='0': 7 tot=tot+1 8 else: 9 a.append(len(s)-1-i) 10 a.reverse() 11 p=0 12 l=0 13 r=min(len(a),31) 14 while l<=r: 15 mid=(l+r)//2 16 sum=0 17 for i in range(mid): 18 sum=sum+2**a[i] 19 if sum<=k: 20 l=mid+1 21 p=mid 22 else: 23 r=mid-1 24 return (p+tot)
记忆化深搜.
设dp[i][j]表示高为i、宽为j的木头可以获得的最大价值。
那么,我们就可以对每一种裁法进行暴搜,获得最大值。
1 typedef long long ll; 2 const int N = 209 ; 3 ll dp[N][N]; 4 map<pair<int,int>,int> mp; 5 class Solution { 6 public: 7 long long dfs(int h,int w){ 8 if(dp[h][w]!=-1) return dp[h][w]; 9 // if(!h||!w) return 0; 10 ll ans=0; 11 if(mp[{h,w}]) ans=mp[{h,w}]; 12 for(int i=1;i<h;i++) ans=max(ans*1ll,dfs(i,w)+dfs(h-i,w)); 13 for(int i=1;i<w;i++) ans=max(ans*1ll,dfs(h,i)+dfs(h,w-i)); 14 return dp[h][w]=ans; 15 } 16 long long sellingWood(int m, int n, vector<vector<int>>& prices) { 17 memset(dp,-1,sizeof(dp)); 18 mp.clear(); 19 for(int i=0;i<prices.size();i++){ 20 mp[{prices[i][0],prices[i][1]}]=prices[i][2]; 21 } 22 return dfs(m,n); 23 } 24 };