poj 1179 Polygon
2015-09-04 00:55
701 查看
题目链接:http://poj.org/problem?id=1179
思路:区间dp,石子归并的变形。考虑到最大值可能由最小值*最小值转化过来,所以不仅要记录最大值也要记录最小值。
代码
思路:区间dp,石子归并的变形。考虑到最大值可能由最小值*最小值转化过来,所以不仅要记录最大值也要记录最小值。
代码
#include<cstdio> #include<algorithm> #include<iostream> #include<vector> using namespace std; const int N=55; const int INF=1<<30; int main() { int n; while(scanf("%d",&n)!=EOF) {int a ;char t[2*N]; int dpmax[2*N][2*N],dpmin[2*N][2*N]; //dpmax[i][j]表示 i到j区间内的最大值,dpmin[i][j]表示i到j区间内的最小是 for(int i=1;i<=n;i++) { scanf(" %c%d",&t[i-1],&a[i]); dpmax[i][i]=dpmin[i][i]=a[i]; } for(int i=1;i<=n;i++) dpmax[i+n][i+n]=dpmin[i+n][i+n]=a[i]; for(int i=0;i<n;i++) t[i+n]=t[i]; for(int L=2;L<=n;L++) { for(int i=1;i<=2*n-L+1;i++) { int j=i+L-1; dpmax[i][j]=-INF;dpmin[i][j]=INF; for(int k=i;k<j;k++) { if(t[k]=='t') { dpmax[i][j]=max(dpmax[i][j],dpmax[i][k]+dpmax[k+1][j]); dpmin[i][j]=min(dpmin[i][j],dpmin[i][k]+dpmin[k+1][j]); } else { dpmax[i][j]=max(dpmax[i][j],dpmax[i][k]*dpmax[k+1][j]); dpmax[i][j]=max(dpmax[i][j],dpmin[i][k]*dpmin[k+1][j]); dpmin[i][j]=min(dpmin[i][j],dpmin[i][k]*dpmin[k+1][j]); dpmin[i][j]=min(dpmin[i][j],dpmin[i][k]*dpmax[k+1][j]); dpmin[i][j]=min(dpmin[i][j],dpmax[i][k]*dpmin[k+1][j]); dpmin[i][j]=min(dpmin[i][j],dpmax[i][k]*dpmax[k+1][j]); } } } } int res=-INF; for(int i=1;i<=n;i++) res=max(res,dpmax[i][i+n-1]); printf("%d\n",res); int flag=0; for(int i=1;i<=n;i++) { if(res==dpmax[i][i+n-1]) { if(flag) printf(" ");flag=1; printf("%d",i); } } printf("\n"); } return 0; }
相关文章推荐
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android px、dp、sp之间相互转换
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- POJ-1695-Magazine Delivery-dp
- nyoj-1216-整理图书-dp
- TYVJ1193 括号序列解题报告
- 对DP的一点感想
- TYVJ上一些DP的解题报告
- soj1005. Roll Playing Games
- 01背包问题
- LeetCode之Maximum Product Subarray
- DP Flow
- zoj3605 Find the Marble(三维dp)
- Word Break I,II, Triangle,Palindrome Partitioning 动态规划 DP