题目
这道题乍一看,发现跟几天前做过的那道书的整理岂不是差不多的吗?
只是权值改变了而已而且有几个地方需要修改,结尾的时候需要判断一下
其实本质上没变化
然后A了
#include<bits/stdc++.h>
using namespace std;
int dp[1001][1001];
int dis[1001][1001];//前i个中选择j个的最小值
struct node{
int x, y;
}a[100001];
int main(){
memset(dp,0x3f3f,sizeof(dp));
int n,k;
cin>>n>>k;
int m=n-k;
for(int i=1;i<=n;i++){
cin>>a[i].x>>a[i].y;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
dis[i][j]=abs(a[i].x-a[j].x)+abs(a[i].y-a[j].y);
dis[j][i]=dis[i][j];
}
}
dp[1][1]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=min(i,m);j++){
for(int k=1;k<=i-1;k++){
dp[i][j]=min(dp[i][j],dp[k][j-1]+dis[i][k]);//前i个里面选择j个可以等价于前k个取j-1个再加上ik距离
}
}
}
int minn=0x3f3f3f;
for(int i=m;i<=n;i++){
minn=min(minn,dp[i][m]+dis[i][n]);
}
cout<<minn;
}
然后今天还写了联合权值,暴力大概70分?然后正解有待晚上思考哦