hdu 5234 Happy birthday
题意:
今天是Gorwin的生日。所以她的妈妈要实现她的一个愿望。Gorwin说她想吃很多蛋糕。所以他妈妈带她来到了蛋糕园。
这个园子被分成了n*m个方格子。在每一个格子里面,有一个蛋糕。第i行,第j列的格子中有一个重量为w[i][j]千克的蛋糕,Gorwin从左上角(1,1)的格子开始走,走到右下角(n,m)的格子。在每一步中,Gorwin可以向右或者向下走,即是:Gorwin站在(i,j)的时候,她可以走向(i+1,j)或者(i,j+1) (然而她不能走出这个花园)。
当Gorwin到达一个格子的时候,她可以把那个格子里面的蛋糕吃完或者不吃。但是,她不能只吃一部分。她的胃不是那么大,所以她最多只能吃K千克的蛋糕。现在,Gorwin站在左上角,她在看蛋糕园的地图,想要找出一条路,能够使得她吃到的蛋糕最多的一条路。请你来帮帮忙。
限制:
0 < n,m,k,w[i][j] <= 100
思路:
01背包
处理好一维,二维就行了。
复杂度O(n^3)
/*hdu 5234 Happy birthday 题意: 今天是Gorwin的生日。所以她的妈妈要实现她的一个愿望。Gorwin说她想吃很多蛋糕。所以他妈妈带她来到了蛋糕园。 这个园子被分成了n*m个方格子。在每一个格子里面,有一个蛋糕。第i行,第j列的格子中有一个重量为w[i][j]千克的蛋糕,Gorwin从左上角(1,1)的格子开始走,走到右下角(n,m)的格子。在每一步中,Gorwin可以向右或者向下走,即是:Gorwin站在(i,j)的时候,她可以走向(i+1,j)或者(i,j+1) (然而她不能走出这个花园)。 当Gorwin到达一个格子的时候,她可以把那个格子里面的蛋糕吃完或者不吃。但是,她不能只吃一部分。她的胃不是那么大,所以她最多只能吃K千克的蛋糕。现在,Gorwin站在左上角,她在看蛋糕园的地图,想要找出一条路,能够使得她吃到的蛋糕最多的一条路。请你来帮帮忙。 限制: 0 < n,m,k,w[i][j] <= 100 思路: 01背包 处理好一维,二维就行了。 复杂度O(n^3) */ #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=105; int a[N][N]; int dp[N][N][N]; void init(){ memset(dp,0,sizeof(dp)); } void gao(int n,int m,int v){ for(int i=a[0][0];i<=v;++i){ dp[0][0][i]=a[0][0]; } for(int i=1;i<n;++i){ for(int j=0;j<=v;++j){ if(j<a[i][0]) dp[i][0][j]=dp[i-1][0][j]; else dp[i][0][j]=max(dp[i-1][0][j],dp[i-1][0][j-a[i][0]]+a[i][0]); } } for(int i=1;i<m;++i){ for(int j=0;j<=v;++j){ if(j<a[0][i]) dp[0][i][j]=dp[0][i-1][j]; else dp[0][i][j]=max(dp[0][i-1][j],dp[0][i-1][j-a[0][i]]+a[0][i]); } } for(int i=1;i<n;++i){ for(int j=1;j<m;++j){ for(int k=0;k<=v;++k){ if(k<a[i][j]) dp[i][j][k]=max(dp[i-1][j][k],dp[i][j-1][k]); else dp[i][j][k]=max(max(dp[i-1][j][k],dp[i-1][j][k-a[i][j]]+a[i][j]),max(dp[i][j-1][k],dp[i][j-1][k-a[i][j]]+a[i][j])); } } } printf("%d\n",dp[n-1][m-1][v]); } int main(){ int n,m,k; while(scanf("%d%d%d",&n,&m,&k)!=EOF){ init(); for(int i=0;i<n;++i) for(int j=0;j<m;++j) scanf("%d",&a[i][j]); gao(n,m,k); } return 0; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。