解題報告 Vijos1143 三取方格數

2021-07-28 21:07:54 字數 989 閱讀 8143

還記得馬攔過河卒嗎?如果把馬去掉,那就是一題標準的從左上角走到右下角得到最大值的方法

f[i][j]=max(f[i-1][j],f[i][j-1])+a[i][j]

現在要取三次,可以看做有三個人同時從左上角走向右下角,取走路上的值(每個格仔只能取一次)

所以說現在的狀態不能用f[i][j]來表示了

可以用f[x1][y1][x2][y2][x3][y3]表示現在三個人的狀態((x1,y1),(x2,y2),(x3,y3)分別是三人座標)

考慮到三個人是同時走的,所以在每一步,x1+y1=x2+y2=x3+y3

所以可以用f[step][x1][x2][x3]表示三人的狀態,step=x1+y1=x2+y2=x3+y3,可以算出y1,y2,y3

於是我們得到了超長的動態轉移方程

f[step][x1][x2][x2]=max(f[step-1][x1][x2][x3],f[step-1][x1-1][x2][x3],f[step-1][x1][x2-1][x3],f[step-1][x1][x2][x3-1],f[step-1][x1-1][x2-1][x3],f[step-1][x1-1][x2][x3-1],f[step-1][x1][x2-1][x3-1],f[step-1][x1-1][x2-1][x3-1])+a[i][step-i+1]+a[j][step-j+1]+a[k][step-k+1];

我的程式

#include #include 

#include

int f[50][30][30][30

];int a[30][30

];int

n,m;

int max(int a,int

b)int min(int a,int

b)int getmax(int step,int x1,int x2,int

x3)void pick(int

step)

}int

main()

VIJOS 1143 三方格取數

jerryzhou同學經常改編習題給自己做。這天,他又改編了一題。設有n n的方格圖,我們將其中的某些方格填入正整數,而其他的方格中放入0。某人從圖得左上角出發,可以向下走,也可以向右走,直到到達右下角。在走過的路上,他取走了方格中的數。取走後方格中數字變為0 此人從左上角到右下角共走3次,試找出3...

A 取石子遊戲(解題報告)

a 取石子遊戲 time limit 1000msmemory limit 10000kb64bit io format i64d i64u submit status description 有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,一是可以在任意...

取石子遊戲解題報告

有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,一是可以在任意的一堆中取走任意多的石子 二是可以在兩堆中同時取走相同數量的石子。最後把石子全部取完者為勝者。現在給出初始的兩堆石子的數目,如果輪到你先取,假設雙方都採取最好的策略,問最後你是勝者還是敗者。in...