http://acm.sgu.ru/problem.php?contest=0&problem=104
水题 DP 但是wa了一次 本来应该初始化为负无穷的 结果初始化为0了 细节呀
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cmath> #include<map> #include<set> #include<vector> #include<stack> #include<queue> #define ll long long using namespace std; const int INF=0x3f3f3f3f; const int N=105; int v[N][N]; int dp[N][N]; int pre[N][N]; int main() { //freopen("data.in","r",stdin); int n,m; while(cin>>n>>m) { memset(pre,0,sizeof(pre)); memset(v,0,sizeof(v)); for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) dp[i][j]=-INF; for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) cin>>v[i][j]; for(int i=1;i<=n;++i) for(int j=i;j<=m;++j) { if(i==1) {dp[i][j]=v[i][j];continue;} for(int w=i-1;w<j;++w) { if(dp[i][j]<dp[i-1][w]+v[i][j]) { dp[i][j]=dp[i-1][w]+v[i][j]; pre[i][j]=w; } } } int I=n,J=1; for(int j=1;j<=m;++j) if(dp[n][j]>dp[n][J]) J=j; cout<<dp[I][J]<<endl; stack<int>st; while(I>=1) { st.push(J); int l=I,r=J; I=l-1; J=pre[l][r]; } while(!st.empty()) { cout<<(st.top())<<" "; st.pop(); }cout<<endl; } return 0; }