狀態轉移有兩種,一種是對於乙個狀態v找出這個狀態能夠來自哪些狀態u,然後更新v,但有時這種轉移方法不太好用,那麼考慮另一種轉移方法,對於乙個狀態u,我們考慮狀態u能夠影響的所有狀態v,然後不斷鬆弛,像spfa一樣...
這題就是第二種轉移方法。
另外inq標記陣列確實能節省時間,畢竟減少了節點入隊次數... 這題不加inq16ms,加上inq 0ms
#include#include#include#include#include#includeusing namespace std;
#define inf 0x7fffffff
int dp[15][1<<10];
bool inq[15][1<<10];
struct road
road(int b,int c,int p,int r)
};vectorgra[15];
int work(int n)
{ queueq1,q2;
int i,j,u,v,c,p,r,s;
memset(inq,0,sizeof(inq));
for(i=0;i<10;++i)
for(j=0;j<(1<<10);++j)
dp[i][j]=inf;
dp[0][1]=0,inq[0][1]=true;
q1.push(0),q2.push(1);
while(!q1.empty())
{u=q1.front();
q1.pop();
s=q2.front();
q2.pop();
inq[u][s]=false;
for(i=0;i
POJ3411 狀態壓縮DP
給n個城市,m條路,並給出m條路的資訊,每條資訊給出起點a終點b和中間節點c,有兩種付款方式 1 在中間節點c付款 就是可以提前交錢 r a,b 2 到終點b付款 p a,b 問1到n的最小花費dp i s 經過在集合s中的點到達i的最短花費 1 當s中沒有c時 dp b s b min dp i ...
poj 2068(博弈 狀態轉移)
如果某個狀態能到達的狀態都是必勝態,那麼此狀態為必敗態 如果某個狀態能到達的狀態存在必敗態,那麼此狀態為必勝態 include include include include include include include include include include include includ...
簡單dp的狀態轉移方程集合
1.對於任一種n的排列a,定義它的e值為序列中滿足a i i的數的個數。給定n和k k n 1000 問n的排列中e值為k的個數。dp i j 表示i個數的排列中e值為j的個數。假設現在已有乙個e值為j的i的排列,對於新加入的乙個數i 1,將其加入排列的方法有三 1 把它 放最後,加入後e值不變 2...