前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2021-04-26:整型数组arr长度为n(3 <= n <= 10^4),最初每个数字是

2021-04-26:整型数组arr长度为n(3 <= n <= 10^4),最初每个数字是

原创
作者头像
福大大架构师每日一题
修改2021-05-04 22:25:34
3460
修改2021-05-04 22:25:34
举报

2021-04-26:整型数组arr长度为n(3 <= n <= 10^4),最初每个数字是<=200的正数且满足如下条件: 1. arr0 <= arr1。2.arrn-1 <= arrn-2。3. arri <= max(arri-1, arri+1)。但是在arr有些数字丢失了,比如k位置的数字之前是正数, 丢失之后k位置的数字为0。 请你根据上述条件, 计算可能有多少种不同的arr可以满足以上条件。比如 6,0,9 只有还原成 6,9,9满足全部三个条件,所以返回1种。

福大大 答案2021-04-26:

这道题有难度。看答案用到了动态规划。时间太晚了,所以写得简单。

代码用golang编写。代码如下:

代码语言:txt
复制
package main

import (
    "fmt"
)

func main() {
    arr := []int{6, 0, 9}
    ret := ways3(arr)
    fmt.Println(ret)
}

func ways3(arr []int) int {
    N := len(arr)
    dp := make([][][]int, N)
    for i := 0; i < N; i++ {
        dp[i] = make([][]int, 201)
        for j := 0; j < 201; j++ {
            dp[i][j] = make([]int, 3)
        }
    }

    if arr[0] != 0 {
        dp[0][arr[0]][0] = 1
        dp[0][arr[0]][1] = 1
    } else {
        for v := 1; v < 201; v++ {
            dp[0][v][0] = 1
            dp[0][v][1] = 1
        }
    }
    presum := make([][]int, 201)
    for i := 0; i < 201; i++ {
        presum[i] = make([]int, 3)
    }
    for v := 1; v < 201; v++ {
        for s := 0; s < 3; s++ {
            presum[v][s] = presum[v-1][s] + dp[0][v][s]
        }
    }
    for i := 1; i < N; i++ {
        for v := 1; v < 201; v++ {
            for s := 0; s < 3; s++ {
                if arr[i] == 0 || v == arr[i] {
                    if s == 0 || s == 1 {
                        dp[i][v][s] += sum(1, v-1, 0, presum)
                    }
                    dp[i][v][s] += dp[i-1][v][1]
                    dp[i][v][s] += sum(v+1, 200, 2, presum)
                }
            }
        }
        for v := 1; v < 201; v++ {
            for s := 0; s < 3; s++ {
                presum[v][s] = presum[v-1][s] + dp[i][v][s]
            }
        }
    }
    if arr[N-1] != 0 {
        return dp[N-1][arr[N-1]][2]
    } else {
        return sum(1, 200, 2, presum)
    }
}

func sum(begin int, end int, relation int, presum [][]int) int {
    return presum[end][relation] - presum[begin-1][relation]
}

执行结果如下:

图片
图片

***

左神java代码

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com