zoukankan      html  css  js  c++  java
  • 动态规划:494,576

    class Solution {
    public:
        int findPaths(int m, int n, int N, int i, int j) {
            int M = 1e9 +7;
            if(N==0)return 0;
            int dp[m][n] = {0};
            int dp2[m][n];
            for(int k=0; k<m; ++k)
                for(int t=0; t<n; ++t)
                    dp[k][t]=(k==0)+(k==m-1)+(t==0)+(t==n-1);
                
            int ans = dp[i][j];
            
            for(int p=0; p<N-1; ++p){
                for(int k=0; k<m; ++k){
                    for(int t=0; t<n; ++t){             
                        int a = (k>0?dp[k-1][t]:0)% M;
                        int b = (k<m-1?dp[k+1][t]:0) % M;
                        int c = (t>0?dp[k][t-1]:0) % M;
                        int d = (t<n-1?dp[k][t+1]:0) % M;
                        dp2[k][t] = ((a+b)%M+(c+d)%M)%M; 
                        //if(k==i && t==j)
                            //ans = (ans + dp2[k][t])%M;
                    }               
                }
                ans = (ans + dp2[i][j]%M)%M;
                memcpy(dp, dp2, m*n*sizeof(int));
            }
            return ans; 
        }
    };

    思路:

    1) 首先计算数组nums里数的和,设为sum;

    2)设置一维vector数组dp,长度为 2*sum+1,即下标从0到2*sum,实际表示[-sum, sum]范围内和为索引的有多少种方式。

    3)设置一维vector数组d,长度为 2*sum+1,储存每次遍历dp后的值,再覆盖dp。

    注意:

    1)  将一个vector赋值给另一个vector的语句:dp.assign(d.begin(), d.end());

    2)将vector里的值都赋值为0的语句:fill(d.begin(), d.end(), 0);

    3)边界条件:sum<S 时 返回 0

    4)初始化:用+nums[0],-nums[0] 来初始化dp;

    5)遍历中,dp不是累加1,而是累加上上一次的值。

    class Solution {
    public:
        int findTargetSumWays(vector<int>& nums, int S) {
            int n = nums.size();
            if(n==0 && S==0) return 1;
            int sum = 0;
            for(int i=0; i<n;++i){
                sum += nums[i];
            }
            if(sum<S)
                return 0;
            vector<int> dp(2*sum+1, 0);
            vector<int> d(2*sum+1, 0);
            
            dp[sum + nums[0]] += 1;
            dp[sum - nums[0]] += 1;
            
            for(int i=1; i<n; i++){
                for(int j=0; j<2*sum+1; j++){
                    if(dp[j]!=0){
                        d[j+nums[i]] += dp[j];
                        d[j-nums[i]] += dp[j];
                    }
                }
                dp.assign(d.begin(), d.end());
                fill(d.begin(), d.end(), 0);
                
            }
            return dp[sum + S];
        }
    };

     vector中的sort排序:

    vector<int>v;

    1. sort(v.begin(), v.end(),less<int>());//升序(默认)
      也可写为:sort(v.begin(), v.end());
    sort(v.begin(), v.end(),greater<int>());//降序
     
     

    思路:首先初始化一个二维dp[k][t] 矩阵,用来保存需要n步(n<N)走出边界。初始化:当k==0 || k==m-1 || t==0 || t==n-1 时都可以一步走出去。

    然后循环N次,更新dp矩阵为上下左右的元素相加。设置ans来记录(i,j)位置每次循环的和。

  • 相关阅读:
    ACM的算法分类 2015-04-16 14:25 22人阅读 评论(0) 收藏
    初学Larevel 2014-08-21 11:24 90人阅读 评论(0) 收藏
    初学PHP&MySQL 2014-05-31 12:40 92人阅读 评论(0) 收藏
    codeforces 570 E. Pig and Palindromes (dp)
    codeforces 570 D. Tree Requests (dfs序)
    poj 2157 Maze (bfs)
    cf 570 C. Replacement (暴力)
    cf 570B B. Simple Game(构造)
    cf 570 A. Elections
    hdu 1429胜利大逃亡(续) (bfs+状态压缩)
  • 原文地址:https://www.cnblogs.com/Bella2017/p/10950178.html
Copyright © 2011-2022 走看看