uva 10559——Blocks
2015-12-18 20:04
459 查看
题意:有n个带颜色的方块,同种颜色的方块连成一个区域,每次可以消除一个区域的方块x,然后得到分数x2,右边的方块左移,然后问求最大的分数。
思路:区间dp,dp(i,j,k)表示区间(i,j)在右边添上k个颜色与j相同的方块的最优解。对于每个状态,如果消去j,状态转移到dp(i,p-1,0)+(j-p+k+1)2,要不然枚举q<p使得a[q]=a[j]且a[q]不等于a[q+1],转移到dp(q+1,p-1,0)+dp(i,q,j-p+k+1);
code:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const int INF=0x3fffffff;
const int inf=-INF;
const int N=1000000;
const int M=205;
const int mod=1000000007;
const double pi=acos(-1.0);
#define cls(x,c) memset(x,c,sizeof(x))
#define cpy(x,a) memcpy(x,a,sizeof(a))
#define ft(i,s,n) for (int i=s;i<=n;i++)
#define frt(i,s,n) for (int i=s;i>=n;i--)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lrt rt<<1
#define rrt rt<<1|1
#define middle int m=(r+l)>>1
#define lowbit(x) (x&-x)
#define pii pair<int,int>
#define mk make_pair
#define IN freopen("in.txt","r",stdin);
#define OUT freopen("out.txt","w",stdout);
int n,v[M];
int dp[M][M][M];
int sol(int l,int r,int k){
if (l>r) return 0;
int& ans=dp[l][r][k];
if (ans) return ans;
ans=sol(l,r-1,0)+(k+1)*(k+1);
frt(i,r-1,l){
if (v[i]==v[r])
ans=max(ans,sol(l,i,k+1)+sol(i+1,r-1,0));
}
return ans;
}
int main()
{
int T;
scanf("%d",&T);
ft(ca,1,T){
scanf("%d",&n);
ft(i,1,n) scanf("%d",&v[i]);
cls(dp,0);
printf("Case %d: %d\n",ca,sol(1,n,0));
}
}
思路:区间dp,dp(i,j,k)表示区间(i,j)在右边添上k个颜色与j相同的方块的最优解。对于每个状态,如果消去j,状态转移到dp(i,p-1,0)+(j-p+k+1)2,要不然枚举q<p使得a[q]=a[j]且a[q]不等于a[q+1],转移到dp(q+1,p-1,0)+dp(i,q,j-p+k+1);
code:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const int INF=0x3fffffff;
const int inf=-INF;
const int N=1000000;
const int M=205;
const int mod=1000000007;
const double pi=acos(-1.0);
#define cls(x,c) memset(x,c,sizeof(x))
#define cpy(x,a) memcpy(x,a,sizeof(a))
#define ft(i,s,n) for (int i=s;i<=n;i++)
#define frt(i,s,n) for (int i=s;i>=n;i--)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lrt rt<<1
#define rrt rt<<1|1
#define middle int m=(r+l)>>1
#define lowbit(x) (x&-x)
#define pii pair<int,int>
#define mk make_pair
#define IN freopen("in.txt","r",stdin);
#define OUT freopen("out.txt","w",stdout);
int n,v[M];
int dp[M][M][M];
int sol(int l,int r,int k){
if (l>r) return 0;
int& ans=dp[l][r][k];
if (ans) return ans;
ans=sol(l,r-1,0)+(k+1)*(k+1);
frt(i,r-1,l){
if (v[i]==v[r])
ans=max(ans,sol(l,i,k+1)+sol(i+1,r-1,0));
}
return ans;
}
int main()
{
int T;
scanf("%d",&T);
ft(ca,1,T){
scanf("%d",&n);
ft(i,1,n) scanf("%d",&v[i]);
cls(dp,0);
printf("Case %d: %d\n",ca,sol(1,n,0));
}
}
相关文章推荐
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android px、dp、sp之间相互转换
- HP data protector软件学习1--基本角色与基本工作流程
- HP data protector软件学习2--软件组成与界面介绍
- 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