HDU 5092 DP
2014-11-02 18:47
302 查看
DP水题
求从上到下走完,使所取得权值最小,并输出路径,若有多个满足,则输出靠右的
求从上到下走完,使所取得权值最小,并输出路径,若有多个满足,则输出靠右的
#include "stdio.h" #include "string.h" int inf=0x3f3f3f3f; struct node { int x,y; }dp[110][110]; int main() { int Case,ii,i,j,n,m,ans; int a[110][110]; scanf("%d",&Case); for (ii=1;ii<=Case;ii++) { scanf("%d%d",&n,&m); for (i=1;i<=n;i++) for (j=1;j<=m;j++) scanf("%d",&a[i][j]); memset(dp,inf,sizeof(dp)); for (i=1;i<=m;i++) dp [i].x=a [i]; for (i=n-1;i>=1;i--) for (j=1;j<=m;j++) { dp[i][j].x=dp[i+1][j].x+a[i][j]; dp[i][j].y=j; if (j-1>=1 && dp[i+1][j-1].x+a[i][j]<dp[i][j].x) { dp[i][j].x=dp[i+1][j-1].x+a[i][j]; dp[i][j].y=j-1; } if (j+1<=m && dp[i+1][j+1].x+a[i][j]<=dp[i][j].x) { dp[i][j].x=dp[i+1][j+1].x+a[i][j]; dp[i][j].y=j+1; } } ans=inf; for (i=1;i<=m;i++) if (dp[1][i].x<=ans) { ans=dp[1][i].x; j=i; } printf("Case %d\n",ii); printf("%d",j); for (i=1;i<n;i++) { j=dp[i][j].y; printf(" %d",j); } printf("\n"); } return 0; }
相关文章推荐
- Hdu 5092 Seam Carving(dp)
- hdu 5092 Seam Carving(DP+记录路径)
- 【DP】 HDU 5092 Seam Carving
- hdu 5092 Seam Carving(dp)
- hdu 5092 dp
- HDU 5092 Seam Carving(DP)
- HDU 5092 Seam Carving DP
- hdu 5092 dp
- HDU 5092 Seam Carving(上海邀请赛基础DP)
- hdu 5092 Seam Carving 简单DP ”水一炮试试“大法
- HDU 5092 DP
- HDU 5092 Seam Carving(DP, 路径)
- HDU 5092 Seam Carving (dp)
- 【DP】 HDU 5092 Seam Carving
- hdu 5092 Seam Carving (简单数塔DP,题没读懂,,不过可以分析样例)
- HDU 5092 Seam Carving (DP+打印路径)
- hdu 5092 Seam Carving dp+记录路径
- hdu 1257 dp+贪心
- hdu 3516 Tree construction DP+四边形不等式
- HDU 1069 dp