1 solutions
-
0
/*//18pts最开始很快打了个0/1背包的草稿,发现如果有的花美丽值负数那就计算不进去最优解。 //那么考虑两种做法1dp初始化为极小值,解决最优解为负/含有负数的情况 2dp每轮循环第一项保证花必选 #include<iostream> using namespace std; const int maxn = 1E2+10; int f, v, b[maxn][maxn], dp[maxn][maxn]; void dfs(int i, int j){ if(i<1||j<1) return; if(dp[i][j]==dp[i][j-1]){ dfs(i, j-1); }else{ dfs(i-1, j-1); cout<<j<<" "; } } int main(){ cin>>f>>v; for(int i=1;i<=f;i++){ for(int j=1; j<=v; j++){ cin>>b[i][j]; } } for(int i=1;i<=f;i++){ for(int j=1; j<=v; j++){ dp[i][j]=max(dp[i][j-1], dp[i-1][j-1]+b[i][j]);//但这样写可能出现有花摆不上的情况 // cout<<dp[i][j]<<" "; } // cout<<endl; } cout<<dp[f][v]<<endl; dfs(f,v); return 0; } */ #include<iostream> #include<deque> using namespace std; const int maxn = 1E2+10; int f, v, b[maxn][maxn], dp[maxn][maxn]; //void dfs(int i, int j){//递归写法 输出方案(状态转移关键点) // if(i<1||j<1) return;//别忘了递归终止! // if(dp[i][j]==dp[i][j-1]){ // dfs(i, j-1);//第i束花没摆在第j瓶,递归查找j-1瓶 // }else{ // dfs(i-1, j-1);//确认第i束花要摆在第j瓶 // cout<<j<<" "; // } //} void dfs(int i, int j){//迭代写法 deque<int> st; while(i&&j){ if(dp[i][j]==dp[i][j-1]){ j--; }else{ st.push_front(j); i--,j--; } } while(!st.empty()){ cout<<st.front()<<" "; st.pop_front(); } } int main(){ cin>>f>>v; for(int i=1;i<=f;i++){ for(int j=1; j<=v; j++){ cin>>b[i][j]; } } for(int i=1;i<=f;i++){//前i束花 dp[i][i]=dp[i-1][i-1]+b[i][i];//先初始化 第i束花在第i个瓶子,后面以此为基准求最优解,保证第i束花一定要摆 for(int j=i+1; j<=v; j++){//第i束花在第j个瓶子 dp[i][j]=max(dp[i][j-1], dp[i-1][j-1]+b[i][j]); } } cout<<dp[f][v]<<endl; dfs(f,v); return 0; }
- 1
Information
- ID
- 822
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- 3
- Tags
- # Submissions
- 11
- Accepted
- 4
- Uploaded By