日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ZOJ 1234 Chopsticks(动态规划)

發(fā)布時間:2025/6/17 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ZOJ 1234 Chopsticks(动态规划) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Chopsticks

題目鏈接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=234

題目大意:給定n個筷子的長度,取k+8套筷子,每套有3個,長度分別為A,B,C。要求k+8套筷子中(A-B)^2的和最小,輸出這個最小值。

分析:題目中筷子長度是非降序排列的,所以最小的兩個A和B一定是相鄰的。先不考慮筷子C,只要留著就行。

  令dp[i][j]表示從 j 個筷子中取 i 套筷子的最優(yōu)值。

  dp[i][j] = min {dp[i][j-1] , dp[i-1][j-1] | (n - j > 3*(k - i))剩下的筷子可以湊滿}

  可以用滾動數(shù)組

代碼如下:

1 # include<iostream> 2 # include<cstring> 3 # include<cstdio> 4 using namespace std; 5 long MAX = 2147483647; 6 long dp[1005][5005]; 7 long f[5005]; 8 int main(){ 9 int T,i,j,k,n; 10 long temp; 11 cin>>T; 12 while(T--) 13 { 14 scanf("%d%d",&k,&n); 15 for(i=1;i<=n;i++) 16 cin>>f[i]; 17 k += 8; 18 memset(dp,0,sizeof(dp)); 19 for(i=1;i<=k;i++) 20 { 21 for(j=i*2;j<=n;j++) 22 { 23 dp[i][j] = MAX; 24 if(j>i*2) 25 dp[i][j] = dp[i][j-1]; 26 if(n-j>(k-i)*3) 27 { 28 temp = dp[i-1][j-2] + (f[j]-f[j-1])*(f[j]-f[j-1]); 29 if(temp<dp[i][j]) 30 dp[i][j] = temp; 31 } 32 } 33 } 34 cout<<dp[k][n]<<endl; 35 } 36 return 0; 37 }

?

轉載于:https://www.cnblogs.com/acm-bingzi/p/3258805.html

總結

以上是生活随笔為你收集整理的ZOJ 1234 Chopsticks(动态规划)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。