hdu 5234 Happy birthday 背包 dp
Happy birthday
Time Limit: 20 Sec Memory Limit: 256 MB
题目连接
http://acm.hdu.edu.cn/showproblem.php?pid=5234
Description
Input
多组测试数据(大概15组), 每一组数据在一行中给出n, m, K.
在接下来n行中,第i行有m个整数wi1,wi2,wi3,?wim,代表第i行m个蛋糕的重量。
请处理到文件末尾。
[参数约定]
所有输入均为整数。
1<=n,m,K<=100
1<= wij <=100
Output
对于每一个数据,输出一个值,代表Gorwin最多能吃到的蛋糕重量。
Sample Input
Sample Output
0 16
HINT
在第一组数据中,Gorwin不能吃蛋糕的一部分,所以她不能吃掉任何蛋糕。 在第二个数据中,Gorwin按照以下路径行走(1,1)->(2,1)->(2,2)->(2,3) 当她通过一个格子的时候,就把那个格子里面的蛋糕吃光。这样她吃的总重量就是1+4+5+6=16。
题意
题解:
背包DP,dp[i][j][k]表示在i,j位置,容量为k的最大值
然后就转移转移就好了!
代码:
//qscqesze #include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <typeinfo> #include <fstream> #include <map> #include <stack> typedef long long ll; using namespace std; //freopen("D.in","r",stdin); //freopen("D.out","w",stdout); #define sspeed ios_base::sync_with_stdio(0);cin.tie(0) #define maxn 200001 #define mod 10007 #define eps 1e-9 int Num; char CH[20]; //const int inf=0x7fffffff; //нчоч╢С const int inf=0x3f3f3f3f; /* inline void P(int x) { Num=0;if(!x){putchar(‘0‘);puts("");return;} while(x>0)CH[++Num]=x%10,x/=10; while(Num)putchar(CH[Num--]+48); puts(""); } */ inline ll read() { ll x=0,f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f; } inline void P(int x) { Num=0;if(!x){putchar(‘0‘);puts("");return;} while(x>0)CH[++Num]=x%10,x/=10; while(Num)putchar(CH[Num--]+48); puts(""); } //************************************************************************************** int g[110][110]; int dp[110][110][110]; int main() { //freopen("test.txt","r",stdin); int n,m,k; while(scanf("%d%d%d",&n,&m,&k)!=EOF) { memset(dp,0,sizeof(dp)); memset(g,0,sizeof(g)); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) g[i][j]=read(); int ans=0; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { for(int t=g[i][j];t<=k;t++) { dp[i][j][t]=max(dp[i][j][t],max(dp[i-1][j][t],dp[i-1][j][t-g[i][j]]+g[i][j])); dp[i][j][t]=max(dp[i][j][t],max(dp[i][j-1][t],dp[i][j-1][t-g[i][j]]+g[i][j])); ans=max(ans,dp[i][j][t]); } for(int t=0;t<=k;t++) { dp[i][j][t]=max(dp[i][j][t],max(dp[i-1][j][t],dp[i][j-1][t])); ans=max(ans,dp[i][j][t]); } } } printf("%d\n",ans); } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。