[World Final 2017 F] Posterize (DP)
阿新 • • 發佈:2019-02-08
菜雞選手只能刷刷水題了,這個題O(n^3)的dp還是很顯然的.
#include <bits/stdc++.h> #define ll long long using namespace std; /*To confirm a set of k elements, dp is always the best way considering the k elements are in range [0,255]. So we can set dp[i][j],representing the minimum answer that we have used j elements, and we have get the first i initial elements done. After pre-processing f[i][j] as the minimum answer for range[i,j] in the array in O(n^3) time,we can use dp to solve the problem in O(n^3),too. */ ll f[257][257]; ll dp[257][257]; struct node {ll p,num; }t[257]; int n,k; int main (){ int i,j,l; scanf ("%d%d",&n,&k); for (i=1;i<=n;i++) {scanf ("%lld%lld",&t[i].p,&t[i].num);} memset (dp,0x7f,sizeof(dp)); memset (f,0x7f,sizeof(f)); for (l=0;l<=255;l++) {for (i=1;i<=n;i++) {ll num=0; for (j=i;j<=n;j++) {num+=((ll)((t[j].p-l)*(t[j].p-l)))*t[j].num; if (num<f[i][j]) {f[i][j]=num;} } } } dp[0][0]=0; for (i=1;i<=n;i++) {for (j=1;j<=k;j++) {for (l=0;l<i;l++) {dp[i][j]=min(dp[i][j],dp[l][j-1]+f[l+1][i]);} } } printf ("%lld\n",dp[n][k]); return 0; }