1 条题解

  • 0
    @ 2025-4-22 12:44:02

    🔍 解题思路:

    设dp[i][j]表示到第i个村庄为止建立j个邮局的最小距离和,dis[i][j]表示i~j之间建一个邮局的最小距离和,我们很容易得出状态转移方程:dp[i][j]=min{dp[k][j]+dis[k+1][i]}(k<i)

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    const int N=1e3+5;
    
    int dp[N][50],pos[N],dis[N][N];
    //dis[i][j]表示在i~j之间建一个邮局的最小距离和 
    int main(){
         int n,m;
         while(~scanf("%d%d",&n,&m)){
    	         memset(dp,0x3f,sizeof(dp));
             for(int i=1;i<=n;i++){
    		             scanf("%d",&pos[i]);
    		         }
    		        //预处理dis[i][j]
    		        for(int i=1;i<=n;i++){
    			            dis[i][i]=0;
    			             for(int j=i+1;j<=n;j++){
    			               dis[i][j]=dis[i][j-1]+pos[j]-pos[(i+j)/2];
    			            }
    		            dp[i][1]=dis[1][i];
    		         }
    		      
    		        for(int j=2;j<=m;j++){
    		            for(int i=j;i<=n;i++){
    			                 for(int k=j-1;k<i;k++){
    				                    dp[i][j]=min(dp[k][j-1]+dis[k+1][i],dp[i][j]);
    				                }
    			            }
    		        }
    		        printf("%d\n",dp[n][m]);
    	     }
    	    return 0;
     }
    • 1

    信息

    ID
    161
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    2
    上传者