C Collect Jewel :
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
#define LL long long
const int maxn = 3e2+22;
const int inf = 0x3f3f3f3f;
struct edge
{
int from,to,cap,flow,cost;
edge(int u,int v,int c,int l,int co):
from(u),to(v),cap(c),flow(l),cost(co){};
};
vector<int>G[maxn];
vector<edge>len;
int n,m;
int s,t;
void add(int u,int v,int c,int cost)
{
len.push_back(edge(u,v,c,0,cost));
len.push_back(edge(v,u,0,0,-cost));
G[u].push_back(len.size()-2);
G[v].push_back(len.size()-1);
}
int cost;
void init()
{
cost=0;
for(int i=0;i<maxn;i++){
G[i].clear();
}
len.clear();
}
int dis[maxn],pre[maxn];
int inq[maxn];
bool spfa()
{
queue<int>q;
for(int i=0;i<=t;i++) dis[i]=inf,pre[i]=0;
dis[s]=0;
inq[s]=1;q.push(s);
int a=inf;
while(!q.empty()){
int u=q.front();
q.pop();inq[u]=0;
for(int i=0;i<G[u].size();i++){
edge e=len[G[u][i]];
if(e.cap>e.flow&&dis[e.to]>dis[u]+e.cost){
dis[e.to]=dis[u]+e.cost;
pre[e.to]=G[u][i];
a=min(a,e.cap-e.flow);
if(!inq[e.to]){
inq[e.to]=1;
q.push(e.to);
}
}
}
}
if(dis[t]==inf) return 0;
int u=t;
cost+=dis[t]*a;
while(u!=s){
len[pre[u]].flow+=a;
len[pre[u]^1].flow-=a;
u=len[pre[u]].from;
}
return 1;
}
void mincost()
{
while(spfa()){
continue;
}
}
int main()
{
//源点0。 拆点2i-1,2i. 汇点 2*n+1, 答案点 2*n+2;
init();
int T;
scanf("%d",&T);
int k;
int cas=0;
while(T--){
scanf("%d %d %d",&n,&m,&k);
init();
// add(int u,int v,int cap,int cost)
for(int i=1;i<=n;i++){
int x;scanf("%d",&x);
add(2*i-1,2*i,1,-x);
add(2*i-1,2*i,inf,0);
}
s=0,t=2*n+2;
for(int i=1;i<=m;i++){
int u,v,c;
scanf("%d %d %d",&u,&v,&c);
add(2*u,2*v-1,inf,c);
}
for(int i=1;i<=n;i++){
add(0,2*i-1,1,0);
add(2*i,2*n+1,1,0);
}
add(2*n+1,t,k,0);
mincost();
printf("Case #%d: %d\n",++cas,abs(cost));
}
return 0;
}
G - Get the Highest Score:
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
#define LL long long
const int maxn = 1e5+55;
LL dp[maxn];
struct node
{
int len,val;
}a[maxn];
LL sq(int a)
{
return 1LL*a*a;
}
int main()
{
int T;
scanf("%d",&T);
int cas=0;
while(T--){
int n;scanf("%d",&n);
int temp=1;
scanf("%d",&a[1].val);
a[1].len=1;
for(int i=1;i<n;i++){
int x;scanf("%d",&x);
if(x==a[temp].val){
a[temp].len++;
}else{
a[++temp].val=x;
a[temp].len=1;
}
}
if(temp==1){
printf("Case #%d: %lld\n",++cas,sq(a[1].len));
continue;
}
for(int i=1;i<=temp;i++){
if(i==1&&a[1].val==-1)
a[1].val=a[2].val;
if(i==temp&&a[i].val==-1)
a[i].val=a[i-1].val;
if(a[i-1].val==a[i+1].val&&a[i].val==-1){
a[i].val=a[i-1].val;
}
}
int tmp=1;
for(int i=2;i<=temp;i++){
if(a[i].val==a[tmp].val){
a[tmp].len+=a[i].len;
}else{
tmp++;
a[tmp]=a[i];
}
}
dp[0]=0;
for(int i=1;i<=tmp;i++){
dp[i]=dp[i-1]+sq(a[i].len);
if(a[i].val==-1||a[i-1].val==-1){
dp[i]=max(dp[i],dp[i-2]+sq(a[i-1].len+a[i].len));
}
if(a[i].val==-1&&a[i-2].val==-1){
dp[i]=max(dp[i],dp[i-3]+sq(a[i-2].len+a[i-1].len+a[i].len));
}
}
printf("Case #%d: %lld\n",++cas,dp[tmp]);
}
return 0;
}