1. 程式人生 > >【普及組模擬賽】Note

【普及組模擬賽】Note

題目描述

數學課上,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水題,f[i,j]=max(f[i1,j],f[i,j1])

#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]); }