动态规划:洛谷 P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles
洛谷 P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles
洛谷一个普及-的题,我以前也是用DFS做的,现在用DP+滚动数组,提时间省空间!
我的题解:
1 //洛谷 P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 int dp[1005]; 7 int pre[1005];//存放上一层的数据 8 int main() 9 { 10 int n; 11 scanf("%d", &n); 12 int data; 13 for (int i = 1; i <= n; ++i)//输入n层 14 { 15 for (int j = 1; j <= i; ++j)//i层就输入i个元素 16 { 17 scanf("%d", &data); 18 dp[j] = max(pre[j - 1] + data, pre[j] + data); 19 //第一层也没事 反正一开始pre里都是空的 20 //这里用的是滚动数组,节约空间,每一次旧的存在pre中,新的覆盖dp 21 } 22 memcpy(pre, dp, sizeof(dp));//每次把新得到到一层存入pre中 23 //memcpy注意要头文件cstring 24 } 25 int ans = -99999; 26 for (int i = 1; i <= n; ++i) 27 { 28 ans = max(dp[i], ans); 29 } 30 printf("%d", ans); 31 return 0; 32 }
本来想开二维数组,后来发现滚动数组很方便,只需要一个pre存储一下数据,每次用memcpy赋值覆盖一下,十分方便!
通过啦~