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