很水的题目
路径的最优子结构,仅当代价满足时
dp[i][j] += dp[k][l] (k<=i&&l<=j)
这题剪枝可以省600ms,不剪枝基本压着1s过,数据还是可以的
以后要注意适当优化了
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <algorithm> #include <stack> #include <queue> const int inf = (1<<31)-1; const int MAXN = 1e2+10; const int MOD = 1e4; using namespace std; int a[MAXN][MAXN]; int dp[MAXN][MAXN]; int main() { int t; scanf("%d",&t); while(t--){ 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]); } memset(dp,0,sizeof(dp)); dp[1][1] = 1; // int cost; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ for(int k=i;k-i<=a[i][j]&&k<=n;k++){ for(int l=j;k-i+l-j<=a[i][j]&&l<=m;l++){ //剪枝优化 if(i==k&&j==l)continue; dp[k][l] = (dp[k][l]+dp[i][j])%MOD; } } } } /* for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ for(int k=1;k<=i;k++){ for(int l=1;l<=j;l++){ if(i==j&&k==l)continue; if(a[k][l]>=i+j-k-l){ dp[i][j] = (dp[i][j]+dp[k][l])%MOD; } } } } }*/ cout<<dp[n][m]<<endl; } return 0; }