zoukankan      html  css  js  c++  java
  • 2.Dynamic Programming on Stolen Values【dp】

    Problem: There are  n houses built in a line, each of which contains some value in it. A thief is going to steal the maximal value in these houses, but he cannot steal in two adjacent houses because the owner of a stolen house will tell his two neighbors on the left and right side. What is the maximal stolen value?

    For example, if there are four houses with values {6, 1, 2, 7}, the maximal stolen value is 13 when the first and fourth houses are stolen.

    My Code:
    #include <iostream>
    #include <string.h>
    using namespace std;
    
    
    int dp[100];
    
    int main()
    {
    	memset(dp,0,sizeof(dp));
    	const int len=6;
    	int a[len]={6,1,33,7,11,13};
    
    	for(int i=0;i<len;i++)
    	{
    		if(i<2)
    		{
    			if(i==0)
    				dp[i]=a[i];
    			else if(i==1)
    				dp[i]=a[i]>a[i-1]?a[i]:a[i-1];
    		}
    		else
    		{
    			dp[i]=dp[i-2]+a[i]>dp[i-1]?dp[i-2]+a[i]:dp[i-1];
    		}
    
    	}
    	cout<<dp[len-1]<<endl;
    	return 0;
    }
    




    Harry He:
    Analysis: A function  f( i) is defined to denote the maximal stolen value from the first house to the  ithhouse, and the value contained in the  ith house is denoted as  vi. When the thief reaches the  ithhouse, he has two choices: to steal or not. Therefore,  f( i) can be defined with the following equation:
    It would be much more efficient to calculate in bottom-up order than to calculate recursively. It looks like a 1D array with size  n is needed, but actually it is only necessary to cache two values for  f( i-1) and  f( i-2) to calculate  f( i).


    This algorithm can be implemented with the following C++ code:

    int maxStolenValue( const vector< int>& values)
    {
         int length = values.size();
         if(length == 0)
             return 0;

         int value1 = values[0];
         if(length == 1)
             return value1;

         int value2 = max< int>(values[0], values[1]);
         if(length == 2)
             return value2;

         int value;
         for( int i = 2; i < length; ++i)
        {
            value = max< int>(value2, value1 + values[i]);
            value1 = value2;
            value2 = value;
        }

         return value;
    }

    More coding interview questions are discussed in my book <Coding Interviews: Questions, Analysis & Solutions>. You may find the details of this book on  Amazon.com, or  Apress.

    The author Harry He owns all the rights of this post. If you are going to use part of or the whole of this ariticle in your blog or webpages, please add a reference to http://codercareer.blogspot.com/. If you are going to use it in your books, please contact him via zhedahht@gmail.com . Thanks.

  • 相关阅读:
    最短路 dijkstra 优先队列
    树状数组+二分答案查询第k大的数 (团体程序设计天梯赛 L3-002. 堆栈)
    c++优先队列(堆)
    团体程序设计天梯赛 L3-012. 水果忍者
    团体程序设计天梯赛 L2-028. 秀恩爱分得快
    团体程序设计天梯赛 L1-049. 天梯赛座位分配(测试数据+不同方法)
    奇偶校验——设计可以检验错误位置的方法
    奇偶校验的错误概率
    Fibonacci数列时间复杂度之美妙
    团体程序设计天梯赛 L3-016. 二叉搜索树的结构
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3400315.html
Copyright © 2011-2022 走看看