题解 | #合唱队# 动态规划

合唱队

http://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4

#include #include #include

using namespace std;

int main() { int N; cin >> N;

vector<int> height(N);

for (int i = 0; i < N; i++)
{
	cin >> height[i];
}

vector<int> raise(N);
vector<int> down(N);

raise[0] = 0;
down[N - 1] = 0;

for (int i = 0; i < N; i++)
{
	for (int j = 0; j < i; j++)
	{
		if (height[i] > height[j])
		{
			raise[i] = max((raise[j] + 1), raise[i]);//使用动态规划的方法找到从开头到当前位置,最长的递增序列(不包括第i个元素)
		}
	}
}

for (int m = N-1; m >= 0; m--)
{
	for (int n = N - 1; n > m; n--)
	{
		if (height[n] < height[m])
		{
			down[m] = max((down[n] + 1),down[m]);//使用动态规划的方法找到到当前位置到末尾,最长的递减序列(不包括第i个元素)
		}
	}

}

int g,max=0;
for (int k = 0; k < N; k++)
{
	g = raise[k] + down[k]+1;//求解第i个位置的递增递减序列的和
	max = (g > max) ? g : max;//求解第i个位置,递增递减序列的最长的值是多少
}
cout << (N-max) << endl;//总的人数减去有用的人数就得到了该被提出退伍的人数


return 0;

}

全部评论

相关推荐

ming_ri:“很抱歉,您的简历和我们当前的职位需求不是很匹配”
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务