[World Final 2017 F] Posterize (DP)

来源:互联网 发布:anaconda ubuntu 路径 编辑:程序博客网 时间:2024/06/06 13:17

菜鸡选手只能刷刷水题了,这个题O(n^3)的dp还是很显然的.

#include <bits/stdc++.h>#define ll long longusing 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;}


原创粉丝点击