1、左上角到右下角最大路径和。
解:动规不解释。
2、0到非负整数m之间所有整数,各自的二进制表示中1的个数。
解:递推,i:前一个数若最后的二进制位是0,则当前数的二进制1个数是前一个数二进制个数+1;ii:前一个数最后的二进制位是1,则向前找连续的二进制1的个数nCount,当前数的二进制1个数是前一个数二进制个数-nCount+1;
#include<iostream>
/*
1\二维矩阵,
*/
#include<vector>
using namespace std;
int ShortestPath(vector<vector<int> >arr){
vector<vector<int> > dp(arr.size(),vector<int>(arr[0].size(),0));
dp[0][0]=arr[0][0];
for(int col(1);col<arr[0].size();col++){ //第一行
dp[0][col]=dp[0][col-1]+arr[0][col]; //只能左边来
}
for(int row(1);row<arr.size();row++){ //第一列
dp[row][0]=dp[row-1][0]+arr[row][0]; //只能上边来
}
for(int row(1);row<arr.size();row++){
for(int col(1);col<arr[0].size();col++){
dp[row][col]=std::min(dp[row][col-1],dp[row-1][col])+arr[row][col];
}
}
return dp[arr.size()-1][arr[0].size()-1];
};
//
int get1Count(int n){
//返回n的二进制表示中bit1的个数
int i(0),nCount(0);
while(i<sizeof(int)*8){
if((n>>i)&1)nCount++;
i++;
}
return nCount;
};
void get0m1Count(int m){
vector<int> arrCount(m+1,0);
for(int i(0);i<=m;i++){
arrCount[i]=get1Count(i);
}
};
void get0m1Count(int m){
vector<int> arrCount(m+1,0);
arrCount[0]=0;
for(int i(1);i<=m;i++){
//如果前面一个数的最右一个二进制为是0,那么二进制1个数+1;
//如果前面一个数的最有一个二进制位是1,那么求1连续的个数n,当前数字的二进制1个数就是前面数字二进制1个数的和减去n+1
if(!(arrCount[i-1]&1)) arrCount[i]=arrCount[i-1]+1;
else{
//找1连续的个数
int j(1),nCount(1);
while(arrCount[i-1]>>j++&1) nCount++; //
arrCount[i]=arrCount[i-1]-nCount+1;
}
}
}
int main(int argc,char* argv[]){
return 0;
}