CodeForces 264C Choosing Balls dp(水
来源:互联网 发布:ipad程序加密软件 编辑:程序博客网 时间:2024/06/10 09:06
题目链接:
题意:
给定n q 表示有n个石头 q个询问
下面n个数字给出每个石头的价值
下面n个数字给出每个石头的颜色(用1-n表示)
选出一个子序列使得序列的权值和最大(序列权值计算方式:当这个点的颜色和前面那个点颜色相同时 贡献 value * a, otherwise 贡献 value * b)
下面q行,每行给出 a 和 b的值。
思路:
首先求dp方程 dp[i]表示颜色为i时的最大值 那么 this_point_value = max(dp[j] + b*v[i]) (i!=j) this_point_value = max(dp[i] + a*v[i]) dp[color[i]] = this_point_value;
就是这样。
import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.text.DecimalFormat;import java.util.ArrayDeque;import java.util.ArrayList;import java.util.Arrays;import java.util.Collection;import java.util.Collections;import java.util.Comparator;import java.util.Deque;import java.util.HashMap;import java.util.Iterator;import java.util.LinkedList;import java.util.Map;import java.util.PriorityQueue;import java.util.Scanner;import java.util.Stack;import java.util.StringTokenizer;import java.util.TreeMap;import java.util.TreeSet;import java.util.Queue;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;public class Main {int n, q, a, b;int[] v = new int[N], c = new int[N];long[] dp = new long[N];int[] pre = new int[N];long max1, max2;int col1, col2;void up(long val, int col){if(val>=max1){if(val>max1){if(col == col1){max1 = val;}else {max2 = max1; col2 = col1;max1 = val; col1 = col;}}else if(col!=col1){max2 = val; col2 = col;}}else if(val >= max2){if(col == col1)return;max2 = val; col2 = col;}}void work() throws Exception{n = Int(); q = Int();for(int i = 1; i <= n; i++)v[i] = Int();for(int i = 1; i <= n; i++)c[i] = Int();while(q-->0){a = Int(); b = Int();long ans = 0;max1 = -inf64; max2 = -inf64;col1 = 0; col2 = 0;for(int i = 1; i <= n; i++)pre[i] = -1;for(int i = 1; i <= n; i++){long now = (long)v[i]*b;if(pre[c[i]]!=-1){now = max(now, dp[c[i]] + (long)a*v[i]);//out.print("now1:"+now);}if(col1!=c[i] && col1!=0)now = max(now, max1 + (long)b*v[i]);else if(col2!=c[i] && col2!=0)now = max(now, max2 + (long)b*v[i]);//out.println(" now2:"+now);up(now, c[i]);if(pre[c[i]] == -1)dp[c[i]] = now;else dp[c[i]] = max(dp[c[i]], now);pre[c[i]] = i;ans = max(ans, now);//out.println(max1+" "+col1);out.println(max2+" "+col2);out.println(now+" "+ans+" ***");}out.println(ans);}} public static void main(String[] args) throws Exception{ Main wo = new Main(); in = new BufferedReader(new InputStreamReader(System.in)); out = new PrintWriter(System.out); // in = new BufferedReader(new InputStreamReader(new FileInputStream(new File("input.txt")))); // out = new PrintWriter(new File("output.txt")); wo.work(); out.close(); }static int N = 100000+5;static int M = 101;DecimalFormat df=new DecimalFormat("0.0000");static int inf = (int)1e9;static long inf64 = (long) 1e18;static double eps = 1e-8;static double Pi = Math.PI;static int mod = (int)1e9 + 7 ;private String Next() throws Exception{ while (str == null || !str.hasMoreElements()) str = new StringTokenizer(in.readLine()); return str.nextToken(); } private int Int() throws Exception{ return Integer.parseInt(Next()); } private long Long() throws Exception{ return Long.parseLong(Next()); } private double Double() throws Exception{ return Double.parseDouble(Next()); } StringTokenizer str; static Scanner cin = new Scanner(System.in); static BufferedReader in; static PrintWriter out; /* class Edge{int from, to, dis, nex;Edge(){}Edge(int from, int to, int dis, int nex){this.from = from;this.to = to;this.dis = dis;this.nex = nex;}}Edge[] edge = new Edge[M<<1];int[] head = new int[N];int edgenum;void init_edge(){for(int i = 0; i < N; i++)head[i] = -1; edgenum = 0;}void add(int u, int v, int dis){edge[edgenum] = new Edge(u, v, dis, head[u]);head[u] = edgenum++;}/**/int upper_bound(int[] A, int l, int r, int val) {// upper_bound(A+l,A+r,val)-A;int pos = r;r--;while (l <= r) {int mid = (l + r) >> 1;if (A[mid] <= val) {l = mid + 1;} else {pos = mid;r = mid - 1;}}return pos;}int Pow(int x, int y) {int ans = 1;while (y > 0) {if ((y & 1) > 0)ans *= x;y >>= 1;x = x * x;}return ans;}double Pow(double x, int y) {double ans = 1;while (y > 0) {if ((y & 1) > 0)ans *= x;y >>= 1;x = x * x;}return ans;}int Pow_Mod(int x, int y, int mod) {int ans = 1;while (y > 0) {if ((y & 1) > 0)ans *= x;ans %= mod;y >>= 1;x = x * x;x %= mod;}return ans;}long Pow(long x, long y) {long ans = 1;while (y > 0) {if ((y & 1) > 0)ans *= x;y >>= 1;x = x * x;}return ans;}long Pow_Mod(long x, long y, long mod) {long ans = 1;while (y > 0) {if ((y & 1) > 0)ans *= x;ans %= mod;y >>= 1;x = x * x;x %= mod;}return ans;}int gcd(int x, int y){if(x>y){int tmp = x; x = y; y = tmp;}while(x>0){y %= x;int tmp = x; x = y; y = tmp;}return y;}int max(int x, int y) {return x > y ? x : y;}int min(int x, int y) {return x < y ? x : y;}double max(double x, double y) {return x > y ? x : y;}double min(double x, double y) {return x < y ? x : y;}long max(long x, long y) {return x > y ? x : y;}long min(long x, long y) {return x < y ? x : y;}int abs(int x) {return x > 0 ? x : -x;}double abs(double x) {return x > 0 ? x : -x;}long abs(long x) {return x > 0 ? x : -x;}boolean zero(double x) {return abs(x) < eps;}double sin(double x){return Math.sin(x);}double cos(double x){return Math.cos(x);}double tan(double x){return Math.tan(x);}double sqrt(double x){return Math.sqrt(x);}}
0 0
- CodeForces 264C Choosing Balls dp(水
- codeforces 264C Choosing Balls (dp)
- Codeforces 264 C. Choosing Balls
- 264C - Choosing Balls DP
- Codeforces Round #162 (Div. 1) C Choosing Balls dp
- 【Coder Force】264C - Choosing Balls (DP高难度思维转换)
- CODEFORCES, 265E Choosing Balls
- Codeforces 67C. Sequence of Balls DP!
- codeforces 67C Sequence of Balls (dp)
- Codeforces 67C Sequence of Balls 编辑距离 dp
- Codeforces 554C Kyoya and Colored Balls 【dp + 组合数学】
- [Codeforces 67C] Sequence of Balls (字符串DP)
- CodeForces 219D Choosing Capital for Treeland (树形dp)
- CodeForces 219D Choosing Capital for Treeland | 树形dp
- Codeforces 219D - Choosing Capital for Treeland(树形dp)
- codeforces 219D Choosing Capital for Treeland(树形DP)
- CodeForces 219D Choosing Capital for Treeland (树形DP)
- codeforces 219D D. Choosing Capital for Treeland(树形dp)
- LeetCode---Two Sum
- TCP/IP收发缓存_MSS/MTU算法机制_状态图_连接建立和断开之上的socket函数需要注意的问题
- java_基础_异常
- UVa 1641 - ASCII Area
- Android——AES加密解密
- CodeForces 264C Choosing Balls dp(水
- alt+/没有显示提示信息
- 统计代码注释行的一些问题
- UVA699 - The Falling Leaves
- 行为型设计模式
- 7种android中数据存储方式
- 十年一觉扬州梦,赢得青楼薄幸名
- uGUI两个Canvas其中一个不响应鼠标事件
- HDOJ 题目2222 Keywords Search(AC自动机)