zoukankan      html  css  js  c++  java
  • matrix 矩阵(多维DP)

    题面

    $ solution: $

    这一题其实就是一个非常明显的三维背包问题(但博主太弱了就10分QAQ)

    $ F[i][j][k]: $ 表示走到 $ (i,j) $ 这个位置并且背包容量为 $ k $ 时的最大价值。因为转移时只能向下或向右转移,所以我们可以按行 $ DP $ (从上到下,从左到右遍历),进行滚动数组,从而把第一位省去。

    $ code: $

    #include<iostream>
    #include<cstdio>
    #include<iomanip>
    #include<algorithm>
    #include<cstring>
    #include<cstdlib>
    #include<ctime>
    #include<cmath>
    #include<vector>
    #include<queue>
    #include<map>
    #include<set>
    
    #define ll long long
    #define db double
    #define inf 0x7fffffff
    #define rg register int
    
    using namespace std;
    
    int n,m,t,ans;
    int a[405][405];
    int b[405][405];
    int f[405][405];
    
    inline int qr(){
    	char ch;
    	while((ch=getchar())<'0'||ch>'9');
    	int res=ch^48;
    	while((ch=getchar())>='0'&&ch<='9')
    		res=res*10+(ch^48);
    	return res;
    }
    
    int main(){
    	//freopen("matrix.in","r",stdin);
    	//freopen("matrix.out","w",stdout);
    	n=qr(),m=qr(),t=qr();
    	for(rg i=1;i<=n;++i)
    		for(rg j=1;j<=m;++j)
    			a[i][j]=qr();
    	for(rg i=1;i<=n;++i)
    		for(rg j=1;j<=m;++j)
    			b[i][j]=qr();
    	for(rg i=1;i<=n;++i){
    		for(rg j=1;j<=m;++j){
    			for(rg k=0;k<=t;++k){
    				f[j][k]=max(f[j][k],f[j-1][k]);
    				if(k+a[i][j]>t)continue;
    				f[j][k]=max(f[j][k],f[j][k+a[i][j]]+b[i][j]);
    				f[j][k]=max(f[j][k],f[j-1][k+a[i][j]]+b[i][j]);
    			}
    		}
    	}
    	for(rg j=1;j<=m;++j)
    		for(rg i=0;i<=t;++i)
    			ans=max(ans,f[j][i]);
    	printf("%d
    ",ans);
    	return 0;
    }
    
    
  • 相关阅读:
    课堂检测求一个数的各个位
    猜数字
    登录界面
    课后作业01
    java语言基础问题
    大道至简第一张用java撰写伪代码
    阅读“大道至简”的读后感
    iOS 瀑布流的基本原理
    iOS 生成二维码
    CNContact对通讯录的基本使用(第二篇)
  • 原文地址:https://www.cnblogs.com/812-xiao-wen/p/10328324.html
Copyright © 2011-2022 走看看