Mar 06, 2022
Edit me
#. Problem
1. My approach
Just an easy DFS. It gave the time limit error.
class Solution {
public:
int score = 0;
int arr[20002];
int deleteAndEarn(vector<int>& nums) {
unordered_set<int> s;
// for(int i = 0; i < 20002; i++){
// arr[i] = 0;
// }
for(auto& el : nums){
arr[el]++;
s.insert(el);
}
// for(auto& el: s){
// cout << el << " ";
dfs(s, 0);
// }
return score;
}
void dfs(unordered_set<int> s, int cur_score){
bool flag = false;
for(auto& el: s){
// cout<<el<<endl;;
int score_cnt = arr[el];
if(score_cnt == 0) {
// cout<<0<<endl;;
continue;
} else {
flag = true;
cur_score += el * score_cnt;
int temp0 = arr[el-1];
int temp1 = arr[el+1];
int temp2 = arr[el];
arr[el-1] = 0;
arr[el+1] = 0;
arr[el] = 0;
// cout << el << "*" << score_cnt << " ";
dfs(s, cur_score);
// dfs(m, cur_score);
cur_score -= el * score_cnt;
arr[el-1] = temp0;
arr[el+1] = temp1;
arr[el] = temp2;
}
}
if(!flag){
// cout<<" done => "<< cur_score << endl;;
score = max(score, cur_score);
}
}
};
2. Second approach - DP
Thinking it could be solved by DP, like stairs problem, I applied similar logic and it worked.
class Solution {
public:
int arr[20002];
int dp[20002];
int deleteAndEarn(vector<int>& nums) {
for(auto& el : nums){
arr[el]++;
}
dp[1] = arr[1];
for(int i = 2; i < 20001; i++){
dp[i] = max(dp[i-2] + (i*arr[i]), dp[i-1]);
}
return dp[20000];
}
};
Didn’t need to go all the way to 20001, it’s more natural to get max number and calculate till that. Also for the arrays, it could be substituted by vectors.
Time(O(N)) | Space(O(N)) |
---|---|
4 ms | 9.2 MB |
3. Epilogue
What I’ve learned from this exercise:
- DP!