您的位置:首页 > 其它

SCU 1114-数字三角(dp)

2016-02-28 20:18 267 查看
B - 数字三角Time Limit:0MS     Memory Limit:0KB     64bit IO Format:%lld& %lluSubmit Status Practice SCU1114Appoint description: System Crawler  (2016-02-24)Description下图是个数字三角,请编写一个程序计算从顶部至底部某处一条路径,使得该路径所经过的数字总和最大。73  88  1  02  7  4  41.  每一步可沿左斜线向下或右斜线向下走;2.  1<=三角形行数<=1003.  三角形中的数字为整数 0,1,……,99。4.  如果有多种情况结果都最大,任意输出一种即可。 输入:第一行一个整数N,代表三角形的行数。接下来N行,描述了一个数字三角。 输出:    第一行一个整数,代表路径所经过底数字总和。    第二行N个数,代表所经过的数字。 样例:输入:4 73 88 1 02 7 4 4输出:25 7 3 8 7
这题的最大值容易求出来,但是那个顺序比较难弄一开始弄错了,所以无数wa
#include<iostream>#include<algorithm>#include<cstring>#include<string>#include<cstdio>#include<cmath>#include<ctime>#include<cstdlib>#include<queue>#include<vector>#include<set>using namespace std;const int T=500;#define inf 0x3f3f3f3fLtypedef long long ll;struct node{int dp[T][T];int d[T][T];int vis[T][T];}a;int main(){#ifdef zscfreopen("input.txt","r",stdin);#endifint n,i,j,k;while(~scanf("%d",&n)){for(i=0;i<n;++i){for(j=0;j<=i;++j){scanf("%d",&a.dp[i][j]);a.d[i][j] = a.dp[i][j];if(i==n-1){a.vis[i][j] = j+1;}}}for(i=n-2;i>=0;--i){for(j=0;j<=i;++j){if(a.dp[i+1][j]>=a.dp[i+1][j+1]){a.dp[i][j] = a.dp[i+1][j]+a.dp[i][j];a.vis[i][j] = j;} else {a.dp[i][j] = a.dp[i+1][j+1]+a.dp[i][j];a.vis[i][j] = j+1;}}}printf("%d\n%d ",a.dp[0][0],a.d[0][0]);for(i=1,k=0;i<n;++i){k = a.vis[i-1][k];printf("%d ",a.d[i][k]);}printf("\n");}return 0;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp 动态规划