LeetCode-375-猜数字大小||-C语言

此博客围绕LeetCode第375题猜数字大小II展开,运用C语言进行解答。该题属于算法类题目,通过代码实现解决猜数字大小的问题,体现了C语言在算法解题中的应用。
/*
 * 算法思想:
 * 维护一个二维数组arr[n+1][n+1],其中arr[i][j]表示从i开始到j,猜正确所需要的最少钱
 * 
 * 详见参考:http://www.cnblogs.com/fayin/p/10407176.html
 */

inline int min(int a, int b){
    return a<b ? a:b;
}

inline int max(int a, int b){
    return a>b ? a:b;
}

int get(int start, int end, int n, int arr[n+1][n+1]){
    int i;
    
    if(end-start <= 0){
        if(end==start) arr[start][end] = 0;
        return 0;
    }
    
    if(end-start == 1) {
        arr[start][end] = start;
        return start;
    }
    
    if(arr[start][end] != INT_MAX) return arr[start][end];
    
    for(i=start; i<=end; i++){
        /* 对每个位置i进行访问,表示选取当前i位置猜后,可以猜得对;
         * 每个位置所需钱为max(i+get(start, i-1, n, arr), i+get(i+1, end, n, arr)
         * 因为有可能落在两侧,所以取max; 
         * 每个i位置都能才对,因此选取最小的一个作为最后所需要的钱。
         */
        arr[start][end] = min(arr[start][end], max(i+get(start, i-1, n, arr), i+get(i+1, end, n, arr)));
    }
    
    return arr[start][end];
}

int getMoneyAmount(int n){
    int i=1, j;
    int arr[n+1][n+1];
    
    for(i=0; i<n+1; i++){
        for(j=0; j<n+1; j++){
            arr[i][j] = INT_MAX;
        }
    }
    
    return get(1, n, n, arr);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值