zoukankan      html  css  js  c++  java
  • 地宫取宝

    dp[i,j,k,v]表示当前坐标(i,j)下,拥有k件物品宝物最大价值为v时,方案的最大数。

    i∈[1,M],j∈[1,N],用别人更新自己,最后输出的是dp[1,1,0,0]

    调用dfs(1,1,0,-1),因为v表示当前取到的宝物的价值。判断都是用v和g[i,j]判断,但是dp更新或者传值都是用v+1

    #include <stdio.h>
    #include <memory.h>
    #include <math.h>
    #include <string>
    #include <string.h>
    #include <vector>
    #include <set>
    #include <stack>
    #include <queue>
    #include <algorithm>
    #include <map>
    
    
    #define I scanf
    #define OL puts
    #define O printf
    #define F(a,b,c) for(a=b;a<c;a++)
    #define FF(a,b) for(a=0;a<b;a++)
    #define FG(a,b) for(a=b-1;a>=0;a--)
    #define LEN 100
    #define MAX 0x06FFFFFF
    #define V vector<int>
    #define MOD 1000000007
    
    typedef long long ll;
    
    using namespace std;
    
    int N,M,K;
    int g[LEN][LEN];
    ll dp[LEN][LEN][15][15];
    
    ll dfs(int i,int j,int k,int v){
        ll s=0,t;
        if(dp[i][j][k][v+1]!=-1)
            return dp[i][j][k][v+1];
        if(i==M && j==N){
            if(k==K){    //不取 
                dp[i][j][k][v+1]=1;
            }else if(k==K-1 && g[i][j]>v){    //
                dp[i][j][k][v+1]=1;
            }else{
                dp[i][j][k][v+1]=0;
            }
            return dp[i][j][k][v+1];
        }
        t=g[i][j];
        if(t>v){//
            if(i+1<=M)
                s+=dfs(i+1,j,k+1,t)%MOD;    
            if(j+1<=N) 
                s+=dfs(i,j+1,k+1,t)%MOD;    
        }
        //不取
        if(i+1<=M)
            s+=dfs(i+1,j,k,v)%MOD;    
        if(j+1<=N) 
            s+=dfs(i,j+1,k,v)%MOD;
        dp[i][j][k][v+1]=s%MOD;
        return dp[i][j][k][v+1];
    }
    
    int main(){
    //    freopen("D:/CbWorkspace/blue_bridge/地宫取宝_1.txt","r",stdin);
        I("%d%d%d",&M,&N,&K);
        int i,j;
        F(i,1,M+1) F(j,1,N+1) I("%d",&g[i][j]);
        memset(dp,-1,sizeof dp);
        dfs(1,1,0,-1);
        O("%lld
    ",dp[1][1][0][0]%MOD);
        return 0;
    }
  • 相关阅读:
    斐波那契数列 的两种实现方式(Java)
    单链表反转
    单链表合并
    两个有序list合并
    list去重 转载
    RemoveAll 要重写equals方法
    Java for LeetCode 138 Copy List with Random Pointer
    Java for LeetCode 137 Single Number II
    Java for LeetCode 136 Single Number
    Java for LeetCode 135 Candy
  • 原文地址:https://www.cnblogs.com/TQCAI/p/8643303.html
Copyright © 2011-2022 走看看