提供个二维dp的方法,主要就是记录一下,i个位置中间左半部分最后一个和中间右半部分最后一个有没有人,有人减掉就可以了。代码太长了,贴不下,给大家看个核心部分吧。 初始化100000个座位的情况,用哈希表存第一次出现的值,二维dp数组,dp[i][0]表示i个座位最多坐多少人,dp[i][1]表示,i个座位的情况下,第一个位置有没有坐人,dp[i][2]表示,i个座位的情况下,最后一个位置有没有坐人,将作为拆分成中间一个,中间左边的座位left和中间右边的座位right。这样dp[i][0]=dp[left][0]+dp[right][0]+1,再判断left最后有没有人,right第一个有没有人,有人就--; //前面会初始化dp数组0-5,写不下了 int temp = 3; for (int i = 6; i < 100000; i++) { if (i % 2) { int left = i / 2, right = i - left - 1; dp[i][0] = dp[left][0]+ dp[right][0]+ 1; dp[i][0]-= dp[left][2] ; dp[i][0]-= dp[right][1]; dp[i][1] = dp[left][1]; dp[i][2] = dp[right][2]; } else { int left = (i / 2)-1, right = i - left - 1; dp[i][0] = dp[left][0] + dp[right][0] + 1; dp[i][0] -= dp[left][2]; dp[i][0] -= dp[right][1]; dp[i][1] = dp[left][1]; dp[i][2] = dp[right][2]; } if (dp[i][0] > temp) { temp = dp[i][0]; hashmap.insert(pair<int, int>(temp, i)); } } //最后直接在哈希表里查询 问一下大佬们,题目中n是10^18,我试了下long long,直接爆了😂
点赞 评论

相关推荐

牛客网
牛客企业服务