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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[HDU 6157]The Karting(DP)

發布時間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [HDU 6157]The Karting(DP) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

[HDU 6157]The Karting

description

solution

先用前綴和求出di:1→id_i:1\rightarrow idi?:1i 的距離

前綴和滿足:若在iii點進行方向改變,則iii產生的貢獻是一定的,可以先累計貢獻

也就是說真正的路徑怎么走,我們是不關心的,只關心在哪些點進行了轉向操作

fi,j,k:f_{i,j,k}:fi,j,k?:iii個點選了jjj個特別點left→rightleft\rightarrow rightleftrightright→leftright\rightarrow leftrightleft轉向多kkk

  • iii點不是特別點

    fi?1,j,k→fi,j,kf_{i-1,j,k}\rightarrow f_{i,j,k}fi?1,j,k?fi,j,k?

  • iii點是特別點,但iii處不轉向

    fi?1,j?1,k→fi,j,kf_{i-1,j-1,k}\rightarrow f_{i,j,k}fi?1,j?1,k?fi,j,k?

  • iiileft→rightleft\rightarrow rightleftright轉向

    fi?1,j?1,k?1+D?2?di→fi,j,kf_{i-1,j-1,k-1}+D-2·d_i \rightarrow f_{i,j,k}fi?1,j?1,k?1?+D?2?di?fi,j,k?

  • iiiright→leftright\rightarrow leftrightleft轉向

    fi?1,j?1,k+1+D+2?di→fi,j,kf_{i-1,j-1,k+1}+D+2·d_i\rightarrow f_{i,j,k}fi?1,j?1,k+1?+D+2?di?fi,j,k?

答案即為fn,m,0f_{n,m,0}fn,m,0?

最后一定是個環,兩種類型的轉向次數一定是相同的

因為did_idi?是前綴和,根據dpdpdp的設定,顯然多的轉向類型產生的貢獻是?-?,靠另一種轉向進行抵消

code

#include <cstdio> #include <iostream> using namespace std; #define maxn 105 #define inf 0x3f3f3f3f int n, m, D; int d[maxn]; int f[maxn][maxn][maxn];int main() {while( ~ scanf( "%d %d", &n, &m ) ) {scanf( "%d", &D );d[1] = 0;for( int i = 2;i <= n;i ++ ) {scanf( "%d", &d[i] );d[i] += d[i - 1];}for( int i = 0;i <= n;i ++ )for( int j = 0;j <= m;j ++ )for( int k = 0;k <= m;k ++ )f[i][j][k] = -inf;f[0][0][0] = 0;//f(i,j,k):前i個數選了j個標記點且從左到右轉向個數比從右到左轉向個數多k個的最大收益 for( int i = 1;i <= n;i ++ ) {f[i][0][0] = 0;for( int j = 1;j <= min( i, m );j ++ ) {for( int k = 0;k <= j;k ++ )f[i][j][k] = max( f[i - 1][j][k], f[i - 1][j - 1][k] );//不轉向i距離就會該方向上的更遠點的d算進去 所以不再加d[i] for( int k = 0;k < j;k ++ )f[i][j][k] = max( f[i][j][k], f[i - 1][j - 1][k + 1] + D + ( d[i] << 1 ) );for( int k = 1;k <= j;k ++ )f[i][j][k] = max( f[i][j][k], f[i - 1][j - 1][k - 1] + D - ( d[i] << 1 ) );}}printf( "%d\n", f[n][m][0] );}return 0; }

總結

以上是生活随笔為你收集整理的[HDU 6157]The Karting(DP)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。