Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<map>
- using namespace std;
- int n;
- const int N = 1e5 + 10;
- long long int INF = 1e9;
- long long int cost[N];
- string str[N];
- map<string, map<int, bool>> viz;
- map<string, map<int, long long int>> dp;
- string rev(string s){
- string ans = "";
- for(int i=s.size()-1; i >= 0; i--) ans += s[i];
- return ans;
- }
- long long int solve(string last, int i){
- if(i >= n) return 0ll;
- if(viz[last][i]) return dp[last][i];
- int L = cost[i] + solve(rev(str[i]), i+1);
- int R = solve(str[i], i+1);
- if(last > str[i]) R = INF;
- if(last > rev(str[i])) L = INF;
- viz[last][i] = true;
- return dp[last][i] = min(L, R);
- }
- int main(){
- cin >> n;
- for(int i=0; i < n; i++) cin >> cost[i];
- for(int i=0; i < n; i++) cin >> str[i];
- long long int ans = solve("a", 0ll);
- if(ans < INF) cout << ans << endl;
- else cout << -1 << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement