【普及組模擬賽】Note
阿新 • • 發佈:2019-01-29
題目描述
數學課上,D突然想到一件很重要的事情要告訴Z,但是她們分別坐在教室的左前方和右後方,這可怎麼辦呢?
D決定傳紙條!
但是問題又出現了,D要告知Z的是個機密,D不希望有很多人知道。可是由於紙條必須經過其它同學,所以D只好希望知道這個機密的人越少越好。
每個同學都有一個好奇程度k(0≤k≤20),好奇程度越大,偷看紙條的可能性也就越大,D希望傳遞紙條的路徑經過的同學的好奇程度和越小越好。
我們假定每個同學只會將紙條傳遞給ta後方或者右方的同學。
輸入
第1行,兩個整數n,m,表示教室有n行m列。(1≤n,m≤100)
第2行到第n+1行,每行m個整數,表示每個同學的好奇程度。
其中D在第1行第1列,Z在第n行第m列,她們的好奇程度都為0。
輸出
共1行,1個整數,表示傳遞路徑的好奇程度.
思路
很明顯的dp水題,
#include <stdio.h>
using namespace std;
int f[1000][1000],a[1000][1000];
int min(int x,int y)
{
return x<y?x:y;
}
int main()
{
freopen("note.in","r", stdin);
freopen("note.out","w", stdout);
int n,m;
scanf("%d%d" ,&n,&m);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
for (int i=2;i<=m;i++)
f[1][i]=f[1][i-1]+a[1][i];
for (int i=2;i<=n;i++)
f[i][1]=f[i-1][1]+a[i][1];
for (int i=2;i<=n;i++)
for (int j=2 ;j<=m;j++)
f[i][j]=f[i][j]+min(f[i-1][j],f[i][j-1])+a[i][j];
printf("%d",f[n][m]);
}