时间限制: 1Sec 内存限制: 128MB 提交: 915 解决: 583
题目描述
在一座山上,有很多很多珠宝,它们散落在山底通往山顶的每条道路上,不同道路上的珠宝的数目也各不相同.下图为一张藏宝地图:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
”夺宝奇兵”从山下出发,到达山顶,如何选路才能得到最多的珠宝呢?在上图所示例子中,按照5-> 7-> 8-> 3-> 7的顺序,将得到最大值30
输入
第一行正整数N(100> =N> 1),表示山的高度
接下来有N行非负整数,第i行有i个整数(1< =i< =N),表示山的第i层上从左到右每条路上的珠宝数目
输出
一个整数,表示从山底到山顶的所能得到的珠宝的最大数目.
样例输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出
30
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int str[100][100];
memset(str,0,sizeof(str));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++){
cin>>str[i][j];
}
}
int cns=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++){
str[i][j]=str[i][j]+max(str[i-1][j-1],str[i-1][j]);
if(str[i][j]>cns){
cns=str[i][j];
}
}
}
cout<<cns<<endl;
return 0;
}
动态规划代码笔记
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int arr[]={3,34,4,12,5,12};
bool dp(int *arr,int s){
bool opt[6][s+1];
memset(opt,0,sizeof(opt));
for(int i=0;i<6;i++){
opt[i][0]=true;
}
for(int i=0;i<=s;i++){
opt[0][i]=false;
}
opt[0][arr[0]]=true;
for(int i=1;i<6;i++){
for(int j=1;j<=s;j++){
if(arr[i]>j){
opt[i][j]=opt[i-1][j];
}
else{
bool a=opt[i-1][j-arr[i]];
bool b=opt[i-1][j];
opt[i][j]=(a||b);
}
}
}
return opt[5][s];
}
int main(){
cout<<dp(arr,25);
}
//int arr[]={3,34,4,12,5,12};
//bool dfs(int *arr,int i,int s){
// if(s==0){
// return true;
// }
// if(i==0){
// return arr[0]==s;
// }
// if(arr[i]>s){
// return dfs(arr,i-1,s);
// }
// else{
// int a=dfs(arr,i-1,s-arr[i]);
// int b=dfs(arr,i-1,s);
// return a||b;
// }
//
//}
//
//
//int main(){
// cout<<dfs(arr,6,46)<<endl;
// return 0;
//}
int arr[]={1,2,4,1,7,8,3};
int dp(int *arr){
int opt[7];
memset(opt,0,sizeof(opt));//数组清零
opt[0]=arr[0];
opt[1]=max(arr[0],arr[1]);
for(int i=2;i<=6;i++){
int a=opt[i-2]+arr[i];
int b=opt[i-1];
opt[i]=max(a,b);
}
return opt[6];
}
int main(){
cout<<dp(arr);
}
//int arr[]={1,2,4,1,7,8,3};
//int dfs(int *arr,int i){
// if(i==0){
// return arr[0];
// }
// else if(i==1){
// return arr[1];
// }
// else{
// int a=dfs(arr,i-2)+arr[i];
// int b=dfs(arr,i-1);
// return max(a,b);
// }
//}
//
//int main(){
// cout<<dfs(arr,6);
//}