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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

zoj 3747 (DP)(连续至多,连续至少)

發(fā)布時(shí)間:2024/8/26 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 zoj 3747 (DP)(连续至多,连续至少) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5170

?

參考:

http://blog.csdn.net/cc_again/article/details/24841249

?

UPDATE:

第二次做的感受,說下這道題為什么用遞推。對于這種排序,且連續(xù)至多的問題,每個(gè)點(diǎn)放什么受到之前那個(gè)點(diǎn)是什么的影響,也就是說這個(gè)點(diǎn)的情況可以由前面那個(gè)點(diǎn)的情況推出來

?

題目意思:

給n個(gè)士兵排隊(duì),每個(gè)士兵三種G、R、P可選,求至少有m個(gè)連續(xù)G士兵,最多有k個(gè)連續(xù)R士兵的排列的種數(shù)。

?

一個(gè)最多,一個(gè)最少很難判斷??梢赞D(zhuǎn)化成兩個(gè)最多。

至少有m個(gè) = ?取值 m~n =??{最多有n個(gè)} - {最多有m-1個(gè)}

?

因?yàn)槭乔罂偳闆r個(gè)數(shù),第n個(gè)的情況可以從第n-1個(gè)的情況推出,所以可以用遞推。

然后就是狀態(tài)方程:

第i個(gè)的情況,至少有u個(gè)G,k個(gè)R

dp[i][0] 表示 G ?

dp[i][1] 表示 R

dp[i][2] 表示 P

?

當(dāng)?shù)趇個(gè)為P時(shí)      前面沒有任何限制條件, dp[i][2] = dp[i-1][0] +?dp[i-1][1] +?dp[i-1][2]

當(dāng)?shù)趇個(gè)為G時(shí)

若 i<=u ? ? ? ? ? ? ? ? ? 沒有任何限制,      dp[i][0] = dp[i-1][0] +?dp[i-1][1] +?dp[i-1][2]

若 i=u+1      需要減去前u個(gè)都是G的情況,dp[i][0] = dp[i-1][0] +?dp[i-1][1] +?dp[i-1][2]-1

若i>u+1      需要減去(i-1)~(i-u)個(gè)連續(xù)G的情況,dp[i][0] = dp[i-1][0] +?dp[i-1][1] +?dp[i-1][2]-dp[i-u-1][1]-dp[i-u-1][2]

當(dāng)?shù)趇個(gè)為R時(shí)    同G

#include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #include <algorithm> #include <stack> using namespace std;#define MEM(a,b) memset(a,b,sizeof(a)) #define pf printf #define sf scanf #define debug printf("!/m") #define INF 1100000 #define MAX(a,b) a>b?a:b #define blank pf("\n") #define LL long long #define M 1000000007LL dp[INF][5]; LL n,m,k,u,v;LL Cal() {dp[0][0] = 1;//初始化時(shí)可以隨意放一個(gè),沒有什么影響,因?yàn)楹竺嬉呀?jīng)把所有情況考慮進(jìn)去dp[0][1] = 0;dp[0][2] = 0;int i;for(i = 1;i<=n;i++){LL sum = (dp[i-1][0] + dp[i-1][1] + dp[i-1][2])%M;dp[i][2]=sum;if(i<=u)dp[i][0] = sum;else if(i==u+1)dp[i][0] = (sum-1)%M;elsedp[i][0] = (sum - dp[i-u-1][1] - dp[i-u-1][2])%M;if(i<=v)dp[i][1] = sum;else if(i==v+1)dp[i][1] = (sum - 1)%M;elsedp[i][1] = (sum - dp[i-v-1][0] - dp[i-v-1][2])%M;}return (dp[n][0]+dp[n][1]+dp[n][2])%M; }int main() {while(~sf("%lld%lld%lld",&n,&m,&k)){u = n;v = k;LL ans = Cal();u = m-1;v = k;ans = ((ans - Cal())%M+M)%M;pf("%lld\n",ans);}return 0; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/qlky/p/5022649.html

與50位技術(shù)專家面對面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的zoj 3747 (DP)(连续至多,连续至少)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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