腾讯算法笔试 第5题

腾讯算法笔试 第5题 能用动态规划吗?0那个要怎么做?#腾讯##笔试题目#
全部评论
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() {     int n;     cin >> n;     vector<int> work(n, 0);     vector<int> play(n, 0);     int dp1, dp2, lp1, lp2;     dp1 = dp2 = lp1 = lp2 = 0;     for (int i = 0; i < n; i++)         cin >> work[i];     for (int i = 0; i < n; i++)         cin >> play[i];     for (int i = 0; i < n; i++)     {         lp1 = dp1;         lp2 = dp2;         if (work[i] == 0 && play[i] == 0)         {             dp2 = dp1 = max(lp1, lp2);         }         else if (work[i] == 1 && play[i] == 1)         {             dp1 = max(lp1, lp2 + 1);             dp2 = max(lp2, lp1 + 1);         }         else if (work[i] == 1)         {             dp2 = max(lp1, lp2);             dp1 = max(lp1, lp2 + 1);         }         else         {             dp1 = max(lp1, lp2);             dp2 = max(lp2, lp1 + 1);         }     }     cout << n - max(dp1, dp2) << endl;     system("pause");     return 0; } AC
点赞 回复 分享
发布于 2019-08-17 22:19
#include <iostream> #include <vector> using namespace std; int main() { int n; cin>>n; vector<int> com(n); vector<int> train(n); vector<int> dppp(n); for(int i = 0;i < n;i++) cin>>com[i]; for(int i = 0;i < n;i++) cin>>train[i]; //0:表示工作,1:锻炼 , 2:休息 int num = 0; for(int i = 0;i < n;i++) { if(i == 0 || dppp[i-1] == 2) //随便选 , 只跟后面有关 { if(com[i] == 0 && train[i] == 0) { dppp[i] = 2 ; num++; }else if(com[i] == 1 && train[i] == 1) //两个都可以选 { if(i+1 < n) { if(com[i+1] == 1 && train[i+1] == 1 || (com[i+1] == 0 && train[i+1] == 0)) { dppp[i] = 2; } else { if(com[i+1] == 1) dppp[i] = 1; else dppp[i] = 0; } } else { } }else { if(com[i] == 1) dppp[i] = 0; else dppp[i] = 1; } }else { if(dppp[i-1] == 0) //前一天工作 { if(train[i] == 1) { dppp[i] = 1; }else { dppp[i] = 2; num++; } }else if(dppp[i-1] == 1) //前一天锻炼 { if(com[i] == 1) { dppp[i] = 0; }else { dppp[i] = 2; num++; } } } //cout<<i<<"  "<<dp[i]<<endl; }/* for(int i = 0;i < n;i++) cout<<dp[i]<<"   ";*/ cout<<num<<endl; return 0; } 瞎写的,然后过了
点赞 回复 分享
发布于 2019-08-17 22:24
import sys def get_score(n, nums): dp = [[0] * 3 for _ in range(n)] dp[0] = nums[0] state = [1] * 3 for i in range(3): if nums[0][i] == 0: state[i] == -1 for i in range(1, n): state1 = state[:] for j in range(3): # print(dp, state, nums[i]) cur_max = dp[i - 1][1] cur_idx = 1 for k in [-1, 0, 1]: last_idx = j + k if last_idx < 0 or last_idx > 2: continue cur_sum = dp[i - 1][last_idx] + state[last_idx] * nums[i][j] if cur_sum > cur_max: cur_max = cur_sum cur_idx = last_idx dp[i][j] = cur_max state1[j] = state[cur_idx] if nums[i][j] == 0: state1[j] *= -1 state = state1 return max(dp[-1]) if __name__ == "__main__": n = int(sys.stdin.readline().strip()) nums = [] for _ in range(n): nums.append(list(map(int, sys.stdin.readline().strip().split()))) print(get_score(n, nums)) 交卷了才调完,没测哈~
点赞 回复 分享
发布于 2019-08-17 22:21
算法都通过多少啊
点赞 回复 分享
发布于 2019-08-17 22:17

相关推荐

04-15 23:42
中山大学 Java
ResourceUtilization:过几天楼主就会捧着一堆offer来问牛友们该怎么选辣
点赞 评论 收藏
分享
程序员鼓励师阿欢:哈哈哈哈哈笑死我了😂
点赞 评论 收藏
分享
已oc&nbsp;云智断更了好几天,也有一些话想说,继续更新一篇云智timeline&nbsp;4.18&nbsp;一面&nbsp;半个小时后约二面&nbsp;4.21二面&nbsp;当晚&nbsp;约hr面&nbsp;4.23hr面&nbsp;4.30&nbsp;发offer之前美团的二面挂了,进入人才库,后面又被捞起来面试,4.30号&nbsp;美团又一面,现在还没出一面结果感觉也不报什么希望,就算一面过了,还有二面,我经不起深入拷打,唉,真的,好难五一躺平了五天,吃吃玩玩睡睡~还要担心毕业,科研更是难,唉暑期可能就到此为止了,后面没有时间在这个上面了,要抓紧时间做科研,为了后面能出去实习。大厂,秋招再见!!!有一些感慨:4.1是我的第一次面试,美团,面试的时候紧张到浑身发...
daisy9542:我今晚也是美团一面,已经第六次了。我也面了其他的,没拿到 offer。但我想开了,要按照自己的节奏来,找暑期转正然后秋招大杀四方并不是唯一的出路,其实还有很多选择的,有 0 实习最后秋招拿 offer 了,也有不选择互联网去国企的外企的,考编的,创业的。现在的失败不代表以后的路都是黑暗的,只不过可能运气还没降临到头上。所以现在要做的,就是放平心态,提升自己,通过面试了解到自己的优点和不足,争取下次机会来了能好好抓住
点赞 评论 收藏
分享
评论
点赞
16
分享

创作者周榜

更多
牛客网
牛客企业服务