數學 DFS JZOJ 1764 遊戲

2022-04-30 19:48:07 字數 1373 閱讀 2466

description

xc抽空光顧了lp的飼養場,在一大堆讚美語之後和lp玩起了乙個遊戲——

乙個完整的倒三角有n層,第一層有n個數字,為原始數字,接下來每層都比上一層減少1個數字,並有f[i,j]=f[i-1,j]+f[i-1,j+1] ,如

3  1  2  4

4  3  6

7  9

16由xc給出f[n,1],和乙個限制max(0<=f[1,i]<=max),lp要迅速回答出字典序最小的f[1]序列,即f[1,1]最小的情況下f[1,2]要最小……以此類推。

xc覺得這個問題對於lp還是太簡單了,於是又新增了一些壞點,以座標的形式給出,所謂壞點就是f[i,j]恒為0,現在就讓大家一起來玩這個遊戲吧。

input

第一行四個數 n,m,max,f[n,1]

接下來m行,每行乙個座標,表示是乙個壞點

output

無解則輸出-1

否則輸出n行,第i行輸出f[1,i],要求f[1]字典序最小

sample input

3 1 3 4

2 2

sample output

1

30

data constraint

hint

【資料說明】

40%的資料:n<=10;m=1;max<=10;f[n,1]<=1,000

90%的資料:max<=100

100%的資料:n<=100;m<=20;max<=10,000;0<=f[n,1]<=10,00

我們把它倒過來,然後就會發現它的係數是楊輝三角

然後這個楊輝三角是有阻擋的

在求出最底一層的係數後,我們可以dfs,然後dfs可以有剪枝:當前格所選的數最大不超過 min(max,剩下的數/當前係數)

#include #include 

#include

using

namespace

std;

const

int n=1e2+10

;int

n,m,mx,s,a[n],c[n][n];

bool

rtn;

void dfs(int dep,int

sum)

if (dep==n+1) return

;

if (c[n][dep]==0

)

for (int i=0;i<=min(mx,(s-sum)/c[n][dep]);i++)

}int

main()

for (int i=1;i<=n;i++) printf("

%d\n

",a[i]);

}

view code

數學基礎 遊戲開發數學技術

1 一般式 ax by c 0 a b不同時為0 適用於所有直線 a1 a2 b1 b2 c1 c2 兩直線平行 a1 a2 b1 b2 c1 c2 兩直線重合 橫截距a c a 縱截距b c b 2 點斜式 y y0 k x x0 適用於不垂直於x軸的直線 表示斜率為k,且過 x0,y0 的直線 ...

佔點遊戲(數學)

problem b 佔點遊戲 maple在乙個無限展開的只有整數點的二維平面上找到兩個點,由tmk和maple分別操控這兩個點,兩人輪流操作,每一次操作中tmk或maple可以把他的點移動一格到上 下 左 右四個方向,當tmk操作時,移動到的這個點會被染成紅色,而當maple操作時,移動到的這個點會...

數學故事 火柴遊戲

乙個最普通的火柴遊戲就是兩人一起玩,先置若干支火柴於桌上,兩人輪流取,每次所取的數目可先作一些限制,規定取走最後一根火柴者獲勝。規則一 若限制每次所取的火柴數目最少一根,最多三根,則如何玩才可致勝 例如 桌面上有 n 15 根火柴,甲 乙兩人輪流取,甲先取,則甲應如何取才能致勝 為了要取得最後一根,...