CF#317D dp

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstring>
#include <stack>
#include <set>
#include <map>
#include <vector>

using namespace std;
#define INF 0x2fffffff
#define LL long long
#define MAX(a,b) ((a)>(b))?(a):(b)
#define MIN(a,b) ((a)<(b))?(a):(b)
LL dp[5005][5005];
LL sum[300005];
int a[300005];

int main(){
    int n,k;
    cin >>  n >> k;
    for(int i = 1;i <= n;i++){
        scanf("%d",&a[i]);
    } 
    sort(a+1,a+n+1);
    sum[0] = 0;
    a[0] = a[1];
    for(int i = 1;i <= n;i++){
        sum[i] = sum[i-1] + a[i] - a[i-1];
    }   
    //分成k组
    //有n%k组是长度是n/k+1的,k-n%k组是长度为n/k的 
    int l1 = n/k+1;
    int l2 = n/k;
    int n1 = n%k;
    int n2 = k-n%k;
    for(int i = 0;i <= n1;i++){
        for(int j = 0;j <= n2;j++){
            if(i ==0 || j ==0){
                if(i == 0 && j == 0)
                    dp[i][j] = 0;
                else
                    if(i == 0)
                        dp[i][j] = dp[i][j-1] + sum[j*l2] - sum[(j-1)*l2+1];
                    else
                        dp[i][j] = dp[i-1][j] + sum[i*l1] - sum[(i-1)*l1+1];
                }
            }
            else 
                dp[i][j] = min(dp[i-1][j]+sum[i*l1+j*l2] - sum[(i-1)*l1 +j*l2+1],dp[i][j-1]+sum[i*l1+j*l2]-sum[i*l1+(j-1)*l2+1]);
        }
    }
    cout << dp[n1][n2] << endl;
    return 0; 
}

这是一道很神奇的dp,首先你要找到这个问题的状态。
很明显这个问题的状态不明显,他问题的是最小的和值,这个问题很容易想到是dp,如果一开始就把n,k做状态的映射,首先这个数组开不了,然后这样做并没有意思,因为找不到相关的子问题,n变化和k变化似乎并没有什么关系,找不到相关子问题可以解决原问题,这时候要意识到其实n和k之间能决定另外一种更加鲜明的变量,那就是这里面长度为n/k和长度为n/k+1的序列的长度,设一个为i另外一个为j,这时候如果设dp[i][j]就能能找到可以推出dp[i][j] 的子问题的dp[i-1][j] dp[i][j-1] 这两个子状态可以转移到
dp[i][j] 这个状态去

为了确保在SAP S4HANA中执行年度结账流程的合规性,以及保障数据的安全和准确性,您可以参考《SAP S4HANA财务结账驾驶舱介绍及解压指南》这份资源。首先,确保您已经获得了正确的解压密码“abap_developer”,以访问资源包中的所有文件和信息。 参考资源链接:[SAP S4HANA财务结账驾驶舱介绍及解压指南](https://wenku.youkuaiyun.com/doc/317d928qxn?spm=1055.2569.3001.10343) 在开始之前,请确保您的系统环境已经满足了SAP S4HANA的运行条件,包括软件安装和配置。接下来,您可以依照以下步骤操作: 1. 登录SAP S4HANA系统,打开财务结账驾驶舱。 2. 在仪表盘上,检查是否所有前期准备工作已经完成,比如关账任务的确认、预定义任务的检查等。 3. 使用任务列表功能,按照既定的时间表和流程执行年度结账操作,确保每一步骤都有相应的负责人,并记录下截止日期。 4. 利用自动化流程功能,自动执行重复性的结账任务,减少人工操作误差。 5. 在整个结账过程中,定期查看审计跟踪,确保所有操作都有完整的审计日志。 6. 使用报表工具生成所需的财务报表,并与预期结果进行对比,确保数据的准确性。 7. 对于任何定制化的结账流程,请在配置灵活性的框架内进行设置,并在测试环境中先行验证。 8. 根据需要设置用户授权,确保只有授权用户才能访问敏感数据和执行关键任务。 9. 监控异常处理系统,一旦出现任何异常,及时采取措施并解决问题。 10. 为了提高工作效率,可以利用移动支持功能,在移动设备上查看结账状态和执行简单任务。 完成以上步骤后,您可以在财务结账驾驶舱中查看并确认年度结账流程已经顺利完成。若希望进一步提升您在SAP S4HANA财务结账驾驶舱方面的专业技能,建议深入学习相关的ABAP开发知识,并查阅更多由SAP PRESS出版的专业书籍,这些书籍将为您提供更丰富的理论知识和实战经验。 参考资源链接:[SAP S4HANA财务结账驾驶舱介绍及解压指南](https://wenku.youkuaiyun.com/doc/317d928qxn?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值