标签:typedef sid 输出 possible tar char end memory inf
题目链接:http://poj.org/problem?id=1179
Time Limit: 1000MS Memory Limit: 10000K
Description
Input
Output
Sample Input
4 t -7 t 4 x 2 x 5
Sample Output
33 1 2
题意:
给出一个由无向边和节点组成的环,每个节点上有一个数字,每条边上有一个运算符(加或乘),
现在先割断一条边,然后环就成为一个链,然后你每次可以将这条链上的一条边缩成一个点,产生的新点的权值就是两个节点配合边运算所产生的结果。
不停地缩边成点,直到最后只有一个点为止,求这个点的权值最大是多少。
并给出所有能产生这个最大值的首先割断的边的编号,要求从小到大输出。
题解:
区间DP,wyb出的毒瘤题,每次两个小区间合并的时候,要记得有可能两个最小的负数相乘可能会产生正数最大值。
因此需要同时维护区间最小值和最大值。
AC代码:
#include<cstdio> #include<vector> #include<algorithm> using namespace std; typedef pair<int,int> pii; const int INF=0x3f3f3f3f; const int maxn=55; int n; int op[2*maxn],nm[2*maxn]; pii dp[2*maxn][2*maxn]; inline int calc(int type,int a,int b){return type?a*b:a+b;} inline void updatemn(int &x,int y){if(x>y) x=y;} int solve(int l,int r) { for(int s=2;s<=r-l+1;s++) { for(int st=l,ed=st+s-1;ed<=r;st++,ed++) { dp[st][ed].first=-INF; dp[st][ed].second=INF; for(int mid=st+1;mid<=ed;mid++) { pii le=dp[st][mid-1]; pii ri=dp[mid][ed]; int tmp1=calc(op[mid],le.first,ri.first); dp[st][ed].first=max(dp[st][ed].first,tmp1); dp[st][ed].second=min(dp[st][ed].second,tmp1); int tmp2=calc(op[mid],le.first,ri.second); dp[st][ed].first=max(dp[st][ed].first,tmp2); dp[st][ed].second=min(dp[st][ed].second,tmp2); int tmp3=calc(op[mid],le.second,ri.first); dp[st][ed].first=max(dp[st][ed].first,tmp3); dp[st][ed].second=min(dp[st][ed].second,tmp3); int tmp4=calc(op[mid],le.second,ri.second); dp[st][ed].first=max(dp[st][ed].first,tmp4); dp[st][ed].second=min(dp[st][ed].second,tmp4); } } } return dp[l][r].first; } int main() { scanf("%d",&n); for(int i=0;i<n;i++) { int m; char o[2]; scanf("%s",o); op[i]=op[n+i]=(o[0]==‘x‘); scanf("%d",&m); nm[i]=nm[n+i]=m; } for(int i=0;i<2*n;i++) dp[i][i]=make_pair(nm[i%n],nm[i%n]); int ans=-INF; for(int c=0;c<n;c++) ans=max(ans,solve(c,c+n-1)); vector<int> E; for(int c=0;c<n;c++) if(dp[c][c+n-1].first==ans) E.push_back(c+1); sort(E.begin(),E.end()); printf("%d\n",ans); for(int i=0;i<E.size();i++) printf("%d%c",E[i],(i==E.size()-1)?‘\n‘:‘ ‘); }
数据:
5 x 2 x 3 t 1 t 7 x 4 224 4 5 x -3 t -1 t -7 t -4 x -2 30 1 5 3 t 0 x 1 t -2 0 1 30 x 1 t 1 x 1 t 1 t 1 x 1 x 1 x 1 x 1 x 1 x 1 t 1 t 1 x 1 t 1 x 1 x 1 t 1 x 1 x 1 t 1 x 1 x 1 x 1 x 1 x 1 t 1 x 1 x 1 x 1 288 1 3 6 7 8 9 10 11 14 16 17 19 20 22 23 24 25 26 28 29 30 48 x 1 x 2 x 1 x -1 t 1 x -1 x -1 x 1 t 1 t -1 x 1 t 2 x 1 x 2 t 1 x 1 x -1 x -2 x 1 x 1 t 1 x 1 t 1 x 1 x 1 x 1 t 1 x 1 x 1 x 1 x 1 x 1 x 1 x -1 t 1 x 1 x -1 x -1 t 1 x 1 t 1 x 1 x 1 x -1 t 1 t -1 t -1 x 1 23328 45
标签:typedef sid 输出 possible tar char end memory inf
原文地址:https://www.cnblogs.com/dilthey/p/9826890.html