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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[2020.11.25NOIP模拟赛]出租车【dp】

發布時間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [2020.11.25NOIP模拟赛]出租车【dp】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題面鏈接:https://www.luogu.com.cn/problem/U142298?contestId=37766


題目大意

nnn個人有起點和終點,按順序上車,但下車可以任意順序,車最多同時只能載444個人。求車的最短路程。


解題思路

顯然我們需要把上次上車的人,現在在車上的人下車位置,車的位置壓入狀態中。第二個比較麻煩,也比較大,我們可以預處理把一些沒用的狀態去掉,壓縮一下,然后dpdpdp即可。


codecodecode

#include<cstdio> #include<cstring> #include<algorithm> #define lowbit(x) (x&-x) #define gmin(x,y) x=min(x,y) using namespace std; const int N=1024; int n,k,cnt,f[2100][N][10]; int p[11][11][11][11],rfn[N][4],q[4]; int main() {scanf("%d%d",&n,&k);for(int x1=0;x1<=k;x1++)for(int x2=x1;x2<=k;x2++)for(int x3=x2;x3<=k;x3++)for(int x4=x3;x4<=k;x4++){p[x1][x2][x3][x4]=cnt;rfn[cnt][0]=x1;rfn[cnt][1]=x2;rfn[cnt][2]=x3;rfn[cnt][3]=x4;cnt++;}for(int x1=0;x1<=k;x1++)for(int x2=0;x2<=k;x2++)for(int x3=0;x3<=k;x3++)for(int x4=0;x4<=k;x4++){q[0]=x1;q[1]=x2;q[2]=x3;q[3]=x4;sort(q,q+4);p[x1][x2][x3][x4]=p[q[0]][q[1]][q[2]][q[3]];}memset(f,0x3f,sizeof(f));f[0][p[k][k][k][k]][0]=0;int tmp=0;for(int i=1;i<=n;i++){int x,y;tmp^=1;memset(f[tmp],0x3f,sizeof(f[tmp]));scanf("%d%d",&x,&y);x--;y--; // x=1;y=10;for(int j=0;j<cnt;j++){if(rfn[j][3]!=k)continue;q[0]=rfn[j][0];q[1]=rfn[j][1];q[2]=rfn[j][2];q[3]=y;int z=p[q[0]][q[1]][q[2]][q[3]];for(int w=0;w<k;w++)gmin(f[tmp][z][x],f[!tmp][j][w]+abs(w-x)+1);}for(int j=0;j<cnt;j++){q[0]=rfn[j][0];q[1]=rfn[j][1];q[2]=rfn[j][2];q[3]=rfn[j][3];for(int w=0;w<k;w++){if(q[0]!=k)gmin(f[tmp][p[k][q[1]][q[2]][q[3]]][q[0]],f[tmp][j][w]+abs(w-q[0])+1);if(q[1]!=k)gmin(f[tmp][p[q[0]][k][q[2]][q[3]]][q[1]],f[tmp][j][w]+abs(w-q[1])+1);if(q[2]!=k)gmin(f[tmp][p[q[0]][q[1]][k][q[3]]][q[2]],f[tmp][j][w]+abs(w-q[2])+1);if(q[3]!=k)gmin(f[tmp][p[q[0]][q[1]][q[2]][k]][q[3]],f[tmp][j][w]+abs(w-q[3])+1);}}}int ans=2147483647;for(int i=0;i<k;i++)ans=min(ans,f[tmp][p[k][k][k][k]][i]);printf("%d",ans);return 0; }

總結

以上是生活随笔為你收集整理的[2020.11.25NOIP模拟赛]出租车【dp】的全部內容,希望文章能夠幫你解決所遇到的問題。

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