ÌâÒ⣺¸øÄãn¸öÊý×Ö£¬È»ºó½ÐÄã´ÓÕâЩÊý×ÖÖÐÑ¡³öm¶Ñ£¬Ê¹µÃÿһ¶ÑµÄ×ܺÍ×îС£¬Ò»¶ÑµÄ×ܺ;ÍÊÇÕâÒ»¶ÑÖÐ×î´óÖµ¼õÈ¥×îСֵµÄƽ·½£¬×îºóҪʹµÃËùÓÐ¶Ñ¼ÓÆðÀ´µÄ×ܺÍ×îС¡£ ˼·£º¶ÔÕâЩÊý×ÖÅÅÐòÖ®ºó£¬ºÜÈÝÒ×Ïëµ½DP½â·¨£¬ÓÃdp[i][j]±íʾÊý×ÖiÏÖÔÚÔÚµÚj¶Ñ£¬ÄÇÃ´×ªÒÆ·½³Ì¾ÍÊÇdp[i][j] = min£¨dp[i][j] , dp[k][j - 1] + £¨a[i] - a[k + 1]£© ^ 2£©¡£ÒòΪÒѾÅÅÐò£¬ËùÒÔÕâÒ»¶ÑÖеÄ×î´ó×îСֵÆäʵ¾ÍÊÇa[i]ºÍa[k + 1].ËùÒÔÓÃDP¿É½â¡£ µ«ÊÇ×¢Òâµ½Õâʵ¼ÊÉÏÊÇÐèÒª3ÖØÑ»·µÄ£¬¶øÇÒNºÍM·Ö±ðΪ10 ^ 4ºÍ5 * 10 ^ 3,ËùÒÔ»áTLE. Æäʵ¿´µ½×ªÒÆ·½³ÌºóÃæµÄ²¿·Ö£¬ÎÒÃǾÍÓ¦¸ÃÄÜÏ뵽бÂÊÓÅ»¯µÄ·½·¨¡£ ¼ÙÉèk < l < i,ÎÒÃÇҪʹµÃkµÄ¾ö²ßÓÅÓÚl,ÄÇôҲ¾ÍÊÇdp[k][j - 1] + £¨a[i] - a[k + 1]£© ^ 2 < dp[l][j - 1] + £¨a[i] - a[l + 1]£© ^ 2 . »¯¼òµÃ£¨dp[k][j - 1] + a[k + 1] ^ 2 - £¨dp[l][j - 1] + a[l + 1] ^ 2£©£© / £¨2 * £¨a[k + 1 ] - a[l + 1]£©£© < a[i] . Ò²¾ÍÊÇ˵·ûºÏÉÏÊöбÂÊÒªÇóµÄk,ÊÇÓÅÓÚlµÄ¡£ ÎÒÃÇÓÃg£¨k ,l £©±íʾkµÄ¾ö²ßÓÅÓÚl. ÄÇôÎÒÃÇÿ´Î¸üРdp[i][j]µÄÖµµÄʱºò£¬Ö»ÐèҪȡ³ö×îÓŵľö²ß¼´¿É£¬ËùÒÔÕâһά¾ÍÊÇO£¨1£© . ½øÒ»²½Ëµ£¬ÔÚµÚÒ»¸öwhile ÖУ¬Èç¹ûÕâʱºò¶ÓÁÐÀïÓÐÁ½¸öÔªËØ£¬qe[l + 1] ºÍqe[l].Èç¹ûÕâʱºòg£¨qe[l + 1] , qe[l]£©³ÉÁ¢£¬ÄÇôÕâʱºòqe[l]¾Í²»ÐèÒªÔÙ¼ÆËãÁË£¬ÒòΪqe[l + 1]µÄ¾ö²ß±ÈËû¸üÓÅ£¬ËùÒÔÎÒÃÇÖ»ÐèÒªÕÒ³ö×îÓŵľö²ß£¬¸üÐÂÒ»´Î¼´¿É¡£ ͬÑùµÄ£¬¼ÙÉèk < l < i .Èç¹ûg£¨i , l £© < g£¨l , k£©£¬ÄÇô´ËʱlÊÇ¿ÉÒÔ±»ÓÅ»¯µôµÄ¡£ÒòΪËû²»¿ÉÄÜÊÇ×îÓŽ⡣Õâ¾ÍÊǵڶþ¸öwhileµÄ×÷Óᣠ#include <set> #include <map> #include <stack> #include <cmath> #include <queue> #include <cstdio> #include <string> #include <vector> #include <iomanip> #include <cstring> #include <iostream> #include <algorithm> #define Max 2505 #define FI first #define SE second #define ll long long #define PI acos£¨-1.0£© #define inf 0x3fffffff #define LL£¨x£© £¨ x ¡¶ 1 £© #define bug puts£¨"here"£© #define PII pair<int,int> #define RR£¨x£© £¨ x ¡¶ 1 | 1 £© #define mp£¨a,b£© make_pair£¨a,b£© #define mem£¨a,b£© memset£¨a,b,sizeof£¨a£©£© #define REP£¨i,s,t£© for£¨ int i = £¨ s £© ; i <= £¨ t £© ; ++ i £© using namespace std; #define N 11111 #define M 5555 int dp[N][M] ; int a[N] ; int getU£¨int j ,int k ,int z£©{ return dp[k][j - 1] + a[k + 1] * a[k + 1] - £¨dp[z][j - 1] + a[z + 1] * a[z + 1]£© ; } int getD£¨int k , int z£©{ return 2 * £¨a[k + 1] - a[z + 1]£© ; } int getDP£¨int i , int j ,int k£©{ return dp[k][j - 1] + £¨a[i] - a[k + 1]£© * £¨a[i] - a[k + 1]£© ; } int qe[N * 10] ; void solve£¨£©{ int n , m ; cin ¡· n ¡· m ; for £¨int i = 1 ; i <= n ; i ++ £©cin ¡· a[i] ; sort£¨a + 1 , a + n + 1 £© ; for £¨int i = 0 ; i <= n ; i ++ £©{ for £¨int j = 0 ; j <= m ; j ++ £© dp[i][j] = inf ; dp[i] = £¨a[i] - a £© * £¨a[i] - a £© ; } dp[0][0] = 0 ; for £¨int j = 1 ; j <= m ; j ++ £©{ int l = 0 , r = 0 ; qe[r ++ ] = 0 ; for £¨int i = 1 ; i <= n ; i ++ £©{ while£¨l + 1 < r && getU£¨j , qe[l + 1] , qe[l]£© <= a[i] * getD£¨qe[l + 1] ,qe[l]£©£©l ++ ; dp[i][j] = getDP£¨i , j , qe[l]£© ; while£¨l + 1 < r && getU£¨j , i , qe[r - 1]£© * getD£¨qe[r - 1] , qe[r - 2]£© <= getU£¨j , qe[r - 1] , qe[r - 2]£© * getD£¨i , qe[r - 1]£©£©r -- ; qe[r ++ ] = i ; } } cout ¡¶ dp[n][m] ¡¶ endl; } int main£¨£© { int ca = 0 ; int t ; cin ¡· t ; while£¨t -- £©{ printf£¨"Case %d: ",++ca£© ; solve£¨£© ; } return 0 ; } |