Problem 3 知晓真实之人
题目描述
———————————————-第三幕——————————————————–
Loi_a 在一个幽暗阴冷的山洞醒来,面前只有一个黑衣人
“你醒了”
“这是哪”
“无须多问”
“你是谁”
“无可奉告”
“我要走”
“外面太危险了,你不能出去”
“期末考试要开始了”
“你知道这个世界的真实样子吗”
你知道吗——
和所有的地方一样,有人的地方就有权势的争夺
这是片由国王统治,却无法由国王专制的大陆
这是个国王,a 家,D 家三足鼎立的时代
国王企图挑起 a、D 两家战争,坐收渔利
黑衣人说完,看着 Loi_a 的表情,微微一笑
“这个时代,不过是国王的游戏而已。”
“你若执意要走,我可以送你回去,但现在我的力量被这个石阵所干扰,不能发挥太大作用,我需
要你的帮助。”
Loi_a 开始观察这个石阵,这个石阵是由 n 个石板排列成一行,每个石板都有其自己的高度,两个
相邻的石板会对黑衣人造成它们两个高度差的绝对值的干扰度,现在以 Loi_a 的力量可以移走 k 个
石板,又因为 Loi_a 要首先保证在阵内的石板尽量少,所以他一定会移走 k 个石板,现在他想知道
移走 k 个石板后,石阵对黑衣人产生的最小干扰度。
输入描述
第一行两个整数 n 和 k ,代表有 n 个石板,要移走 k 个石板。
第二行 n 个整数 h[i],为第 i 个石板的高度。
输出描述
一个整数,表示移走 k 个石板后,石阵对黑衣人产生的最小干扰度。
样例输入
4 1
2 4 1 3
样例输出
3
数据范围及提示
对于 30%的数据: 1 <= n <= 10 , k = 1;
对于 100%的数据: 1 <= k < n <= 200 , 0 <= h[i] <= 200;
样例解释:
如图,开始时一共有 4 个石板,高度分别为 2 ,4 ,1 ,3。现在要拿走一块石板,拿走第二块高度为 4
的石板最优,干扰度为|2-1| + |1-3| = 3。
从数据范围上看,自己水过了30分,后面100%的数据想打全排,(深搜k取r),但没打出来。红太阳说这样打深搜O(N)过大,仍旧只得30%%%柳畅大神一讲dp就懂了233,贪心求得的可能是最优解,考虑dp.
dp begin:
i第i个一定选 j是此时已经选了多少个
dp[i][j]=min dp[i-1][j] +i~i-1
dp[i-2][j-1]+i~i-2
dp[i-3][j-2]+i~i-3
....
int dp[205][205];
for(int i=1;i<=n;i++)
for(int j=1;j<=k;j++)
for(int p=0;p<=j;p++)
if(i-p-1<0) continue;
dp[i][j]=min( dp[i][j] , dp[i-p-1][j-p]+abs(H[i]-H[i-p-1]);
ans = dp[n][k];
ans=min(ans,dp[n-1][k-1]);
dp[n-2][k-2];
for(int p=0;p<=k;p++)
ans=min(ans,dp[n-p][k-p]);