自己的dp, 不是很好,这道dp题是 完全自己做出来的,完全没看题解,还是有点进步,虽然这个dp题比较简单。
题意:一个k叉树, 每一个对应权值1-k, 问最后相加权值为n, 且最大值至少为d 的路径有多少条。
思路:d[i][l][sum] 表示第i 行最大值为l, 总和为sum的路径数。
注意:我的代码中 sum + j 有可能会超过数组最大值,即越界,刚开始我以为不会产生影响,后来
发现不知道为什么 在数组里越界以后比如 越界到d[][][111] 会对 d[][][1]产生影响,还是要注意写代码 不要让数据越界吧。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 using namespace std; 7 const int mo = 1000000000 + 7; 8 int dp[110][110][110]; 9 10 int main() 11 { 12 int n, k, d, i, j, l, sum, ans; 13 while(cin>>n>>k>>d) 14 { 15 memset(dp, 0, sizeof(dp)); 16 for(i = 1; i <= k; i++) 17 dp[0][i][i] = 1; 18 for(i = 1; i < n; i++) 19 { 20 for(l = 1; l <= k; l++) 21 for(sum = 1; sum <= 100; sum++) 22 { 23 if(dp[i-1][l][sum] == 0) 24 continue; 25 for(j = 1; j <= k; j++) 26 { 27 if(sum + j > n) //注意,不然数组会越界导致结果错误 28 break; 29 if(j > l) 30 { 31 dp[i][j][sum+j] += dp[i-1][l][sum]; 32 dp[i][j][sum+j] %= mo; 33 } 34 else 35 { 36 dp[i][l][sum+j] += dp[i-1][l][sum]; 37 dp[i][l][sum+j] %= mo; 38 39 } 40 } 41 } 42 } 43 ans = 0; 44 for(j = 0; j < n; j++) 45 for(i = d; i <= 100; i++) 46 { 47 ans += dp[j][i][n]; 48 ans %= mo; 49 } 50 printf("%d ", ans); 51 } 52 return 0; 53 }
贴一下我找我的越界错误的代码,
做完题后 我又找了好长时间错误。。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 using namespace std; 7 const int mo = 1000000000 + 7; 8 int dp[110][110][110]; 9 10 int main() 11 { 12 int n, k, d, i, j, l, sum, ans, flag; 13 while(cin>>n>>k>>d) 14 { 15 flag = 0; 16 memset(dp, 0, sizeof(dp)); 17 for(i = 1; i <= k; i++) 18 dp[0][i][i] = 1; 19 for(i = 1; i < n; i++) 20 { 21 for(l = 1; l <= k; l++) 22 { 23 for(sum = 1; sum <= 100; sum++) 24 { 25 if(dp[i-1][l][sum] == 0) 26 continue; 27 for(j = 1; j <= k; j++) 28 { 29 /*if(sum + j > n) 30 break;*/ 31 if(j > l) 32 { 33 printf("%d ", dp[1][57][1]); 34 dp[i][j][sum+j] += dp[i-1][l][sum]; 35 dp[i][j][sum+j] %= mo; 36 37 if(dp[1][57][1]) 38 { 39 printf("%d %d %d ", i, j, sum+j); 40 printf("%d ", dp[i][j][sum+j]); 41 printf("%d %d %d ", dp[1][57][1], dp[1][57][0], dp[1][57][2]); 42 flag = 1; 43 break; 44 } 45 } 46 else 47 { 48 dp[i][l][sum+j] += dp[i-1][l][sum]; 49 50 dp[i][l][sum+j] %= mo; 51 52 } 53 54 if(flag) 55 break; 56 } 57 if(flag) 58 break; 59 } 60 if(flag) 61 break; 62 } 63 if(flag) 64 break; 65 } 66 ans = 0; 67 for(j = 0; j < n; j++) 68 for(i = d; i <= 100; i++) 69 { 70 ans += dp[j][i][n]; 71 ans %= mo; 72 } 73 // printf("%d ", ans); 74 } 75 return 0; 76 }