Leetcode213. 家を略奪するII(C言語)


Leetcode213. 家を略奪するII(C言語)
アルゴリズム-ダイナミックプランニング(フィボナッチ):アルゴリズムとデータ構造の参照
あなたはプロの泥棒で、街沿いの家を盗む計画で、どの部屋にも現金が隠されています.この場所はすべての家が囲まれていて、最初の家と最後の家が隣接していることを意味しています.また、隣接する家屋には互いに連通する防犯システムが設置されており、隣接する2つの家屋が同じ夜に泥棒に侵入されると、自動的に警報が鳴る.各家屋の保管金額を表す非負の整数配列を与え、警報装置に触れずに盗むことができる最高金額を計算する.例:入力:[1,2,3,1]出力:4
構想:ダイナミックプランニング.dp[i]=max(dp[i-2]+nums[i],dp[i-1])はリング状なので、最初の家を盗む、最後の家を盗まない、最後の家を盗まない、最後の家を盗む
コード:
int rob(int* nums, int numsSize){
     
    if(numsSize==0)   return 0;
    if(numsSize==1)   return nums[0];
    
    int a[numsSize],b[numsSize];
    a[0]=nums[0];   a[1]=nums[0];	//    ,      , numSize-1    
    b[0]=0;     b[1]=nums[1];		//     ,     , numSize  
    
    for(int i=2;i<numsSize;i++){
     
        a[i]=(a[i-1]>(a[i-2]+nums[i]))?a[i-1]:(a[i-2]+nums[i]);
        b[i]=(b[i-1]>(b[i-2]+nums[i]))?b[i-1]:(b[i-2]+nums[i]);
    }
    
    return (a[numsSize-2]>b[numsSize-1])?a[numsSize-2]:b[numsSize-1];
}