1.普通dp
1. day2-C 面试
1.题意2.思路
我们可以发现,对一次进入人的房间做次清空操作,设可以使该房间总风险值变为
所以说,我们可以写出DP方程式
3.代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,k,q;
int dp[110][510],a[511];
int add(int x){
return x*(x+1)/2;
}
int need(int x,int y){
if(y==0) return add(x);
int nk=x/(y+1);
return add(nk)*(y+1)+(x-nk*(y+1))*(nk+1);
}
signed main(){
freopen("interview.in","r",stdin);
freopen("interview.out","w",stdout);
cin>>n>>k>>m;
for(int i=1;i<=n;i++){
cin>>q;
a[q]++;
}
for(int i=1;i<=k;i++){
for(int j=0;j<=m;j++){
dp[i][j]=2e15;
}
}
for(int i=1;i<=k;i++){
for(int j=0;j<=m;j++){
for(int k=0;k+j<=m;k++){
dp[i][k+j]=min(dp[i][k+j],dp[i-1][j]+need(a[i],k));
}
}
}
cout<<dp[k][m]<<endl;
}